1. 程式人生 > >11.文件查找和壓縮

11.文件查找和壓縮

結合 硬盤 時間戳 遞歸文件夾 root file x86_64 sys mode

文件查找

在文件系統上查找符合條件的文件

文件查找:locate, find

  • 非實時查找(數據庫查找):locate
  • 實時查找:find

locate

查詢系統上預建的文件索引數據庫

/var/lib/mlocate/mlocate.db

依賴於事先構建的索引

索引的構建是在系統較為空閑時自動進行(周期性任務),管理員手動更新數據庫
(updatedb)

索引構建過程需要遍歷整個根文件系統,極消耗資源

工作特點:

  • 查找速度快
  • 模糊查找 :只要包含有keyword,不論在文件路徑全名的任何部分,都會顯示出來
  • 非實時查找
  • 搜索的是文件的全路徑,不僅僅是文件名
  • 可能只搜索用戶具備讀取和執行權限的目錄

用法:locate KEYWORD

  • 有用的選項
    -i 不區分大小寫的搜索
    -n N 只列舉前N個匹配項目
    -r 使用基本的正則表達式
  • 示例
    1. 搜索名稱或路徑中帶有“conf”的文件
      locate conf
    2. 使用Regex來搜索以“.conf”結尾的文件
      locate -r ‘\.conf$’
  • 註意:不論它是用普通模式(支持通配符)還是正則表達式模式,都是匹配的包含即可。而find的正則表達式模式必須整個路徑全部精確匹配才可

find

實時查找工具,通過遍歷指定路徑完成文件查找

工作特點:

  • 查找速度略慢
  • 精確查找
  • 實時查找
  • 可能只搜索用戶具備讀取和執行權限的目錄

語法:

  • find [OPTION]... [查找路徑] [查找條件] [處理動作]

查找路徑:指定具體目標路徑,默認為當前目錄

-註意當查找當前目錄的時候,find顯示的結果最前面不是完整路徑名,而是以./開頭的,如果用regex的時候要註意

查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行,默認為找出指定路徑下的所有文件

處理動作:對符合條件的文件做操作,默認輸出至屏幕

  • 註意:find命令默認就遞歸文件夾目錄了,不需要加-r,可以通過下面的最大最小深度來改變默認的全部遞歸
  • 註意find -name的時候默認支持通配符,而locate查看幫助得知默認也是支持通配符(但是中括號的那種貌似不支持),詳細看man幫助解釋
  • 註意find -name匹配通配符時候要加上雙引號,同時裏面的*,?,[],支持匹配開頭帶一個.的文件了

查找條件

指搜索層級

-maxdepth level 最大搜索目錄深度,指定目錄下的文件為第1級
-mindepth level 最小搜索目錄深度
例子:find -maxdepth 1 只搜索當前目錄

先處理目錄內的文件,再處理指定目錄

-depth
它的結果會先顯示文件,最後再顯示目錄和裏面的內容

根據文件名和inode查找:

-name "文件名稱":支持使用glob通配符
*, ?, [], [^]
-iname "文件名稱":不區分字母大小寫
-inum n 按inode號查找
-samefile name 相同inode號的文件
-links n 鏈接數為n的文件
-regex “PATTERN” -

  • 註意:以PATTERN匹配整個文件路徑,而非文件名稱。如果只有包含這個pattern的文件路徑,並不能識別,必須要整個路徑全部匹配才可,因此註意要多加.*
  • locate的基本正則表達式則只需要包含即可,註意區分,這就是精確匹配和模糊匹配的區別
  • 同時註意,如果-name 文件名 的方式,也要多加通配符*,不然它也只會匹配到精確的名字,只不過比正則表達式模式好的地方是它不需要全路徑。

    find 能夠找到的是只有和搜索內容 yum.conf 一致的 /etc/yum.conf 文件,而 /root/yum.conf.bak 文件雖然含有搜索關鍵字,但是不會被找到
    因此可以看出find命令是完全匹配的,必須和搜索關鍵字一模一樣才會列出,可以根據不同搜索模式多加partern,或者regex。

根據屬主、屬組查找:

-user USERNAME:查找屬主為指定用戶(UID)的文件
-group GRPNAME: 查找屬組為指定組(GID)的文件
-uid UserID:查找屬主為指定的UID號的文件
-gid GroupID:查找屬組為指定的GID號的文件
-nouser:查找沒有屬主的文件 :刪除了的用戶創建的文件,下同
-nogroup:查找沒有屬組的文件

根據文件類型查找

-type TYPE
f: 普通文件
d: 目錄文件
l: 符號鏈接文件
s:套接字文件
b: 塊設備文件
c: 字符設備文件
p: 管道文件

空文件或目錄

-empty

示例:find /app -type d -empty

組合條件:

與:-a 默認
或:-o
非:-not !

德·摩根定律:

(非 A) 或 (非 B) = 非(A 且 B)
(非 A) 且 (非 B) = 非(A 或 B)

示例:

!A -a !B = !(A -o B)
!A -o !B = !(A -a B)

find示例

  • 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
  • 找出當前目錄下屬主既不是joe也不是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

註意find裏面的小括號要轉義


排除目錄

  • 示例:
    查找/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"

註意上面的文件夾單引號或者雙引號都可以,但不能在目錄後面多加一個/,不然結果相當於無效,仍然會搜索這些文件夾

-a可以不用,還有如果用-path選項,那麽其後面的文件夾名稱是針對find後面寫的路徑的相對路徑來找的,只有前面也是絕對路徑,-path後面再用絕對路徑才有效,詳細可以看man find幫助


根據文件大小來查找:

-size [+|-]#UNIT
常用單位:k, M, G,c(byte)
#UNIT: (#-1, #]
如:6k 表示(5k,6k]
-#UNIT:[0,#-1]
如:-6k 表示[0,5k]
+#UNIT:(#,∞)
如:+6k 表示(6k,∞)

根據時間戳:

以“天”為單位,註意天數是往前倒著算的,當前為0天
-atime [+|-]#,
#: [#,#+1)
+#: [#+1,∞]
-#: [0,#)
-mtime
-ctime
以“分鐘”為單位
-amin
-mmin
-cmin


技術分享圖片


根據權限查找:

-perm [/|-]MODE
MODE: 精確權限匹配
/MODE:任何一類(u,g,o)對象的權限中只要能一位匹配即可,或關系,+從centos7開始淘汰
-MODE:每一類對象都必須同時擁有指定權限,與關系
上面的兩個MODE中0表示不關註相對應的屬主,屬組,或者其它人

  • find -perm 755 會匹配權限模式恰好是755的文件
  • 只要當任意人有寫權限時,find -perm +222就會匹配
  • 只有當每個人都有寫權限時,find -perm -222才會匹配
  • 只有當其它人(other)有寫權限時,find -perm -002才會匹配
  • 註意:當三位中只有一個位上有數值,另兩位都為0時,/和-並無區別,因為另外兩位不關註了(特殊權限也可以查詢,嚴格點應該有4位)
  • 但是註意,如果沒有/或者-表示精確匹配的時候,0就是代表沒有權限,不是不關註的意思,需要區分

處理動作

-print:默認的處理動作,顯示至屏幕
-ls:類似於對查找到的文件執行“ls -l” 命令
-delete:刪除查找到的文件
-fls file:查找到的所有文件的長格式信息保存至指定文件中,file寫的是文件名,可以不存在它會自己創建一個
-ok COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令,對於每個文件執行命令之前,都會交互式要求用戶確認
-exec COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令
{}: 用於引用查找到的文件名稱自身
find傳遞查找到的文件至後面指定的命令時,查找到所有符合條件的文件一次性傳遞給後面的命令

參數替換xargs

  • 由於很多命令不支持管道|來傳遞參數,xargs用於產生某個命令的參數
  • xargs可以讀入 stdin 的數據,並且以空格符或回車符將 stdin 的數據分隔成為參數一個一個傳給後面的命令
  • 許多命令不能接受過多參數,命令執行可能會失敗,xargs可以解決
  • 需要註意:文件名或者是其他意義的名詞內含有空格符的情況
  • find和xargs的組合:find | xargs COMMAND
  • 示例:
    ls | xargs rm 刪除當前目錄下的大量文件
    find /sbin/ -perm +700 | ls -l 這個命令是錯誤的
    find /bin/ -perm /7000 | xargs ls -Sl
    查找有特殊權限的文件,只要3個sst有一個即可
    find /bin/ -perm -7000 | xargs ls -Sl
    此命令和上面有何區別?
    答:查找有特殊權限的文件,3個特殊權限都必須擁有
    find -type f -name “*.txt” -print0 | xargs -0 rm 以字符nul分隔,這是針對文件名中有空格符的文件來說的
  • 註意:nul它並不是空字符的意思,它是\0 ascii中第一個字符

xargs配合進行多用戶創建

  • xargs後面默認隱藏了echo,後面不加命令的話會把前面傳遞進來的值顯示一遍。但是它會把前面輸入的值裏面的回車默認給換成空格
  • 因為 useradd 不支持一次創建多個用戶,並且也不支持用戶名之間有空格,所以直接傳遞會報錯,必須用xargs -n 1命令讓它每行只顯示一個參數,然後就換行。
  • 這樣配合這個命令便可創建多用戶了。
    例子:

    20:11[root@centos7 /run/media/root/CentOS 7 x86_64/Packages]# seq 5
    1
    2
    3
    4
    5
    20:11[root@centos7 /run/media/root/CentOS 7 x86_64/Packages]# seq 5|xargs
    1 2 3 4 5
    echo newuser{1..5} |xargs -n 1 useradd
  • xargs它本身也是有一個默認換行的長度。因為用touch或者rm命令等,他們本身支持多個參數,所以可以不定義xargs後每一行有多少個參數,但useradd這種一次只能一個的,必須定義一行一個。
  • 用echo {1..100000} |xargs |wc -l 可知分成5行
  • 用echo {1..100000} |xargs >f1.t ,查看f1 ,得知一行有23695個參數,這也是默認換行的每一行最多的參數,touch 等可以支持這麽多的參數。

find示例

  1. 備份配置文件,添加.orig這個擴展名
    find -name “*.conf” -exec cp {} {}.orig \;
  2. 提示刪除存在時間超過3天以上的joe的臨時文件
    find /tmp -ctime +3 -user joe -ok rm {} \;
  3. 在主目錄中尋找可被其它用戶寫入的文件
    find ~ -perm -002 -exec chmod o-w {} \;
  4. 查找/data下的權限為644,後綴為sh的普通文件,增加執行權限
    find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} \;
  5. 查看/home的目錄
    find /home –type d -ls

壓縮、解壓縮及歸檔工具

  1. file-roller
  2. compress/uncompress: .Z
  3. gzip/gunzip: .gz
  4. bzip2/bunzip2: .bz2
  5. xz/unxz: .xz
  6. ?zip/unzip
  7. tar
  8. cpio
    • 壓縮:犧牲CPU性能節省硬盤空間

compress/uncompress

  • compress [-dfvcVr] [-b maxbits] [file ...] ,默認刪除原文件
    -d 解壓縮,相當於uncompress
    -c 結果輸出至標準輸出,不刪除原文件 用法示例:compress -c file >file.Z
    -v 顯示詳情
  • uncompress file.Z 解壓縮
  • zcat file.Z 不顯示解壓縮的前提下查看文本文件內容,相當於預覽
    示例:zcat file.Z >file ,這樣的話也就相當於解壓縮到file中了
  • 註意:如果改了文件後綴*.Z ,則解壓縮無法實施,沒有效果。這個壓縮工具對於文件後綴有要求。

gzip/gunzip

  • gzip [OPTION]... FILE ... 默認刪除原文件
    -d 解壓縮,相當於gunzip
    -c 結果輸出至標準輸出,保留原文件不改變
    -# 指定壓縮比,#取值為1-9,值越大壓縮比越大
    -r 可以遞歸壓縮文件夾裏面的文件,但是是一個一個壓縮成一個一個的文件,並非是壓縮成一個文件,它不能壓縮文件夾
  • gunzip file.gz 解壓縮
  • zcat file.gz 不顯式解壓縮的前提下查看文本文件內容
    示例:
    gzip -c messages >messages.gz
    gzip -c -d messages.gz > messages
    zcat messages.gz > messages
    cat messages | gzip > m.gz
    lscpu |gzip > cpu.gz ; zcat cup.gz
  • gzip可以對標準輸出進行壓縮,比如上面的命令,比如mysql的數據庫備份壓縮。(其實這4個壓縮命令都可以,)

bzip2/bunzip2/bzcat

  • bzip2 [OPTION]... FILE ...
    -k keep, 保留原文件
    -c 結果指向標準輸出
    -d 解壓縮
    -# 1-9,壓縮比,默認為9
  • bunzip2 file.bz2 解壓縮
  • bzcat file.bz2 不顯式解壓縮的前提下查看文本文件內容

xz/unxz/xzcat

  • xz [OPTION]... FILE ...
    -k keep, 保留原文件
    -c 結果指向標準輸出
    -d 解壓縮
    -# 壓縮比,取值1-9,默認為6
  • unxz file.xz 解壓縮
  • xzcat file.xz 不顯式解壓縮的前提下查看文本文件內容

  • 註意只有gzip才有-r選項,上面4個都是針對文件來壓縮的

zip/unzip

打包壓縮

zip –r /backup/sysconfig /etc/sysconfig/
解包解壓縮
unzip sysconfig.zip
cat /var/log/messages | zip messages -
unzip -p message > message

  • 註意: zip -r filezip lists , 前面的是要打包並壓縮成的文件,後面的是需要被壓縮的文件列表或者文件夾。
  • 前面的文件名可以不用加上zip後綴,它會自己加上,後面的lists如果是文件夾,它會把它的路徑記下來,然後解壓的時候會在當前的目錄裏面生成這個路徑(相當於把當前路徑當做壓縮時的路徑的相對路徑了,如果壓縮時寫的絕對路徑,則把當前路徑當做根路徑)

tar工具:打包文件(也可順便用三種壓縮),解包(並可順便解壓)

tar [OPTION]...

(1) 創建新歸檔,保留權限(保留不住ACL權限,需要單獨備份),查看過程,-f指向歸檔
tar -cpvf /PATH/FILE.tar FILE...
(2) 追加文件至歸檔: 註:不支持對壓縮文件追加
tar -r -f /PATH/FILE.tar FILE...
(3) 查看歸檔文件中的文件列表
tar -t -f /PATH/FILE.tar
(4) 展開歸檔
tar -x -f /PATH/FILE.tar
tar -x -f /PATH/FILE.tar -C(大寫) /PATH/
(5) 結合壓縮工具實現:歸檔並壓縮
-j: bzip2, -z: gzip, -J: xz

  • 註意 -c創建新歸檔,-f指向歸檔,同時用可以 ,也可以單獨用-f ,但沒有單獨用-c的。
  • tar 命令不看文件後綴,可以解包解壓,修改後綴也沒事
  • 同理解壓解包也會保留原文件的路徑,如果不加-C 則會解壓到當前路徑,並把當前路徑當做之前壓縮時寫的路徑的參考路徑(寫的絕對路徑則把當前路徑當做根)(它壓縮的時候會刪除掉最前面的/避免解壓覆蓋原文件)。

-exclude 排除文件
tar zcvf /root/a3.tgz --exclude=/app/host1 --exclude=/app/host2 /app
-T 選項指定輸入文件 -X 選項指定包含要排除的文件列表
tar zcvf mybackup.tgz -T /root/includefilelist -X /root/excludefilelist

split:分割一個文件為多個文件

分割大的 tar 文件或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

  • -d選項可以用數字分每個part

cpio :老牌打包工具(不帶壓縮)

  • 功能:復制文件從或到歸檔
  • cpio命令是通過重定向的方式將文件進行打包備份,還原恢復的工具,它可以解壓以“.cpio” 或者“.tar” 結尾的文件
  • cpio [選項] > 文件名或者設備名
  • cpio [選項] < 文件名或者設備名
  • 註意i和o都是針對於內存來說的輸入內存處理解包和內存數據輸出到硬盤打包
  • 選項
    -o 將內存中的數據(前面可用管道)拷貝打包成文件或者將文件打包 ,默認輸出到標準輸出(屏幕),可以用重定向輸出到文件中(相當於-F,可以用-F 代替 重定向符號<\>).例如 ls | cpio -ov >ls.cpio
    -O filename 輸出到指定的歸檔文件名
    -A 向已存在的歸檔文件中追加文件
    -i 解包,將打包文件解壓到當前文件夾或將設備上的備份還原到系統,可用重定向輸入,(-d可以創建文件夾)
    -I filename 對指定的歸檔文件名解壓
    -t 預覽,查看打包後的文件內容列表,可以用重新定向輸入的方式,例如cpio -t <#### .cpio
    -F filename 使用指定的文件名替代標準輸入或輸出
    -d 解包生成目錄,在cpio還原時,自動的建立目錄
    -v 顯示打包過程中的文件名稱

例子cpio

  • 將etc目錄打包:
    find ./etc -print |cpio -ov >bak.cpio
  • 將/data內容追加bak.cpio
    find /data | cpio -oA -F bak.cpio
  • 內容預覽
    cpio –t < etc.cpio
  • 解包文件
    cpio –idv < etc.cpio (解包經測試-d不用也可以)

  • file命令可以查看文件類型,後面直接跟文件即可

11.文件查找和壓縮