Linux基礎管理——文件查找和壓縮(高級使用方法)
GNU Linux操作系統的哲學思想之一即是一切皆是文件,因此使用必要的手段對文件進行搜索、匹配、處理、壓縮解壓,以實現快速定位、快速處置是十分必要的。
1、文件搜索查找原理
文件的搜索查找底層原理分為兩類:實時的、非實時的。其中非實時的文件查找是基於數據庫的,而實時查找則是基於查找條件對文件系統上的所有文件進行搜索、匹配,且是窮盡查找。
非實時查找的代表命令是locate;實時查找的代表是find命令。
1.1、locate原理及特點
原理:
查詢系統上預建的文件索引數據庫,/var/lib/mlocate/mlocate.db。這個數據庫是系統基於一定的機制每天進行定時更新的;如果想要手動進行即時更新,可以使用updatedb命令實現。即mlocate.db數據庫是依賴於事先構建的索引,索引的構建是在系統較為空閑時自動進行(周期性任務),管理員手動更新數據庫(updatedb),索引構建過程需要遍歷整個根文件系統,極消耗系統及硬件資源。
工作特點:
查找速度快; 模糊查找; 非實時查找; 搜索的是文件的全路徑,不僅僅是文件名; 可能只搜索用戶具備讀取和執行權限的目錄。
1.2、locate命令使用
語法:
locate [OPTION]... [PATTERN]... locate KEYWORD
常用選項:
-i 不區分大小寫的搜索; -n N 只列舉前N個匹配項目; -r 使用正則表達式;
示例:
locate conf \搜索名稱或路徑中帶有“ conf”的文件locate -r ‘\.conf$’ \使用Regex來搜索以“ .conf”結尾的文件\
2、find命令
2.1、find工作特點及語法
find是一個實時查找工具,通過遍歷指定路徑完成文件查找。
工作特點:
查找速度略慢; 精確查找; 實時查找; 可能只搜索用戶具備讀取和執行權限的目錄。
語法:
find [OPTION]... [查找路徑] [查找條件] [處理動作]
查找路徑:指定具體目標路徑;默認為當前目錄; 查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行;默認為找出指定路徑下的所有文件。 處理動作:對符合條件的文件做操作,默認輸出至屏幕。
2.2、查找條件
(1)指定搜索層級:
-maxdepth level 最大搜索目錄深度,指定目錄為第1級 -mindepth level 最小搜索目錄深度
(2)根據文件名和inode查找:
-name "文件名稱":支持使用glob,*, ?, [], [^].....。 -iname "文件名稱":不區分字母大小寫。 -inum n 按inode號查找。 -samefile name 相同inode號的文件。 -links n 鏈接數為n的文件。 -regex "PATTERN":以PATTERN匹配整個文件路徑字符串,而不僅僅是文件名稱。
(3)根據屬主、屬組查找:
-user USERNAME:查找屬主為指定用戶(UID)的文件; -group GRPNAME: 查找屬組為指定組(GID)的文件; -uid UserID:查找屬主為指定的UID號的文件; -gid GroupID:查找屬組為指定的GID號的文件; -nouser:查找沒有屬主的文件; -nogroup:查找沒有屬組的文件。
(4)根據文件類型查找:
-type TYPE:
TYPE: f: 普通文件; d: 目錄文件; l: 符號鏈接文件; s:套接字文件; b: 塊設備文件; c: 字符設備文件; p: 管道文件。
(5)指定組合條件,可以實現多個條件搜索:
與:-a 或:-o 非:-not, !
德·摩根定律: (非 A) 或 (非 B) = 非(A 且 B) (非 A) 且 (非 B) = 非(A 或 B)
示例1:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
示例2:
find -name snow.png; find -iname snow.png; find / -name “*.txt”; find /var –name “*log*”; find -user joe -group joe; find -user joe -not -group joe; find -user joe -o -user jane; find -not \( -user joe -o -user jane \); find / -user joe -o -uid 500;
找出/tmp目錄下,屬主不是root,且文件名不以f開頭的文件:
find /tmp \( -not -user root -a -not -name 'f*' \) -ls find /tmp -not \( -user root -o -name 'f*' \) –ls
排除目錄:
查找/etc/下,除/etc/sane.d目錄的其它所有.conf後綴的文件
find /etc -path ‘/etc/sane.d’ -a -prune -o -name “*.conf”
查找/etc/下,除/etc/sane.d和/etc/fonts兩個目錄的其它所有.conf後綴的文件
find /etc \(–path ‘/etc/sane.d’ –o –path ’/etc/fonts’ \) -a -prune –o -name “*.conf”
(6)根據文件大小來查找:
語法:
-size [+|-]#UNIT
常用單位:k, M, G,c(byte)
不同寫法的意義:
#UNIT:(#-1, #],如:6k 表示(5k,6k] -#UNIT:[0,#-1],如:-6k 表示[0,5k] +#UNIT:(#,∞),如:+6k 表示(6k,∞)
(7)根據時間戳:
以“天”為單位:
-atime [+|-]#: # : [#,#+1) +#: [#+1,∞] -#: [0,#) -mtime # : [#,#+1) +#: [#+1,∞] -#: [0,#) -ctime # : [#,#+1) +#: [#+1,∞] -#: [0,#)
以“分鐘”為單位:
-amin -mmin -cmin
(8)根據權限查找:
-perm [/|-]MODE
MODE: 精確權限匹配; /MODE:任何一類(u,g,o)對象的權限中只要能一位匹配即可,或關系,+ 從centos7開始淘汰。 -MODE:每一類對象都必須同時擁有指定權限,與關系。 0 表示不關註。
示例:
find -perm 755 會匹配權限模式恰好是755的文件; 只要當任意人有寫權限時,find -perm +222就會匹配; 只有當每個人都有寫權限時,find -perm -222才會匹配; 只有當其它人(other)有寫權限時,find -perm -002才會匹配。
2.3、處理動作
-print:默認的處理動作,顯示至屏幕; -ls:類似於對查找到的文件執行“ ls -l”命令; -delete:刪除查找到的文件; -fls file:查找到的所有文件的長格式信息保存至指定文件中; -ok COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令,對於每個文件執行命令之前,都會交互式要求用戶確認。 -exec COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令; {}: 用於引用查找到的文件名稱自身; find傳遞查找到的文件至後面指定的命令時,查找到所有符合條件的文件一次性傳遞給後面的命令。
2.4、參數替換xargs
背景:
find傳遞查找到的文件至後面指定的命令時,查找到所有符合條件的文件一次性傳遞給後面的命令,所以在某些場景下需要使用到xargs命令。
由於很多命令不支持管道|來傳遞參數、有些命令不能接受過多參數,命令執行可能會失敗,xargs可以解決而日常工作中有這個必要,所以就有了xargs命令。
xargs用於產生某個命令的參數,xargs 可以讀入 stdin 的數據,並且以空格符或回車符將 stdin 的數據分隔成為arguments。
註意:文件名或者是其他意義的名詞內含有空格符的情況。
示例:
ls f* |xargs rm find /sbin -perm +700 |ls -l 這個命令是錯誤的 find /sbin -perm +7000 | xargs ls –l
find和xargs格式:find | xargs COMMAND
2.5、find示例
備份配置文件,添加.orig這個擴展名
find -name “*.conf” -exec cp {} {}.orig \;
提示刪除存在時間超過3天以上的joe的臨時文件
find /tmp -ctime +3 -user joe -ok rm {} \;
在你的主目錄中尋找可被其它用戶寫入的文件
find ~ -perm -002 -exec chmod o-w {} \;
find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} \; find /home –type d -ls
3、Gnome 搜索工具
圖形框位置:
位置->搜索文件……
圖形化搜索工具,可搜索:
命令 內容 用戶/組群 大小 修改時間
4、壓縮、解壓縮及歸檔工具
4.1、工具一覽
file-roller; compress/uncompress: .Z; gzip/gunzip: .gz; bzip2/bunzip2: .bz2; xz/unxz: .xz; zip/unzip; tar; cpio;
4.2、compress/uncompress
語法:
compress [-dfvcVr] [-b maxbits] [file ...]
選項:
-d: 解壓縮,相當於uncompress -c: 結果輸出至標準輸出,不刪除原文件 -v: 顯示詳情
uncompress 解壓縮
查看並重定向:
zcat file.Z >file
4.3、gzip/gunzip
語法:
gzip [OPTION]... FILE ...
選項:
-d: 解壓縮,相當於gunzip -c: 將壓縮或解壓縮的結果輸出至標準輸出 -#:1-9,指定壓縮比,值越大壓縮比越大
zcat:不顯示解壓縮的前提下查看文本文件內容;
實例:
gzip -c messages >messages.gz gzip -c -d messages.gz > messages zcat messages.gz > messages
4.4、bzip2/bunzip2/bzcat
語法:
bzip2 [OPTION]... FILE ...
選項:
-k: keep, 保留原文件 -d:解壓縮 -#:1-9,壓縮比,默認為9
bzcat:不顯式解壓縮的前提下查看文本文件內容
4.5、xz/unxz/xzcat
語法:
xz [OPTION]... FILE ...
選項:
-k: keep, 保留原文件 -d:解壓縮 -#:1-9,壓縮比,默認為6
xzcat: 不顯式解壓縮的前提下查看文本文件內容
4.6、zip/unzip
打包壓縮:
zip –r /testdir/sysconfig /etc/sysconfig/
解包解壓縮:
unzip sysconfig.zip cat /var/log/messages | zip messages - unzip -p message > message
4.7、tar工具
Tar(Tape ARchive,磁帶歸檔的縮寫)。
語法:
tar [OPTION]......
(1) 創建歸檔
tar -c -f /PATH/TO/SOMEFILE.tar FILE...
(2) 追加文件至歸檔: 註:不支持對壓縮文件追加
tar -r -f /PATH/TO/SOMEFILE.tar FILE...
(3) 查看歸檔文件中的文件列表
tar -t -f /PATH/TO/SOMEFILE.tar
(4) 展開歸檔
tar -x -f /PATH/TO/SOMEFILE.tar tar -x -f /PATH/TO/SOMEFILE.tar -C /PATH/
(5) 結合壓縮工具實現:歸檔並壓縮
-j: bzip2, -z: gzip, -J: xz
-T選項指定輸入文件,-X選項指定包含要排除的文件列表
tar zcvf mybackup.tgz -T /root/includefilelist -X /root/excludefilelist
分割大的 tar 文件為多份小文件:
split –b Size –d tar-file-name prefix-name split -b 1M –d mybackup.tgz mybackup-parts split -b 1M mybackup.tgz mybackup-parts
合並:
cat mybackup-parts* > mybackup.tar.gz
4.8、cpio
功能:復制文件從或到歸檔。
cpio命令是通過重定向的方式將文件進行打包備份,還原恢復的工具,它可以解壓以“ .cpio”或者“ .tar”結尾的文件。
語法:
cpio [選項] > 文件名或者設備名 cpio [選項] < 文件名或者設備名
選項:
-o 將文件拷貝打包成文件或者將文件輸出到設備上 -i 解包,將打包文件解壓或將設備上的備份還原到系統 -t 預覽,查看文件內容或者輸出到設備上的文件內容 -v 顯示打包過程中的文件名稱。 -d 解包生成目錄,在cpio還原時,自動的建立目錄 -c 一種較新的存儲方式
示例:
將etc目錄備份:
find ./etc -print |cpio -ov >etc.cpio
內容預覽
cpio –tv < etc.cpio
解包文件
cpio –idv < etc.cpio
Linux基礎管理——文件查找和壓縮(高級使用方法)