linux 文件的查找和壓縮

1、使用 locate 命令
  需要安裝:yum install mlocate -y
  創建或更新 slocate/locate 命令所必需的資料庫文件:updatedb
  作用:搜索不經常改變的文件如配置文件等,否則需要搜索前更新資料庫
  文件查找:非實時查找(資料庫查找),查詢系統上預建的文件索引資料庫
    /var/lib/mlocate/mlocate.db
  依賴於事先構建的索引,索引的構建是在系統較為空閑時自動進行(周期性任務),管理員手動更新資料庫(updatedb)
  索引構建過程需要遍歷整個根文件系統,極消耗資源

  工作特點:
    查找速度快
    模糊查找
    非實時查找
    搜索的是文件的全路徑,不僅僅是文件名
    可能只搜索用戶具備讀取和執行許可權的目錄

locate 語法:
locate
keyword   -i 不區分大小寫的搜索   -n N 只列舉前 N 個匹配項目   -r 使用正則表達式
# 例:
[root@centos7 ~]#yum install mlocate -y
[root@centos7 ~]#ll bin/hello.sh 
-rwxr-xr-x. 1 root root 58 2月   4 17:10 bin/hello.sh
[root@centos7 ~]#locate hello.sh
locate: 無法執行 stat () `/var/lib/mlocate/mlocate.db': 沒有那個文件或目錄
[root@centos7 ~]#updatedb    # 更新資料庫
[root@centos7 ~]#locate hello.sh
/root/bin/hello.sh
# 例:
# 搜索名稱或路徑中帶有 "conf" 的文件
locate conf

# 使用 Regex 來搜索以 ".conf" 結尾的文件
locate -r '\.conf$'

 

2、 使用 find 命令(功能強大)
  實時查找工具,通過遍歷指定路徑完成文件查找
  工作特點:
    查找速度慢
    精確查找
    實時查找
    可能只搜索用戶具備讀取和執行許可權的目錄(搜索考慮許可權問題)

find 語法:
find [OPTION]… [查找路徑] [查找條件] [處理動作]
  查找路徑:指定具體目標路徑;默認為當前目錄
  
  查找條件:指定的查找標準,可以文件名、大小、類型、許可權等標準進行;默認為找出指定路徑下的所有文件。
    指搜索層級:
      -maxdepth level 最大搜索目錄深度,指定目錄為第一級
      -mindepth level 最小搜索目錄深度

  處理動作:對符合的文件做操作,默認輸出至螢幕     
-print:默認的處理動作,顯示至螢幕     -ls:類似於對查找到的文件執行 "ls -l" 命令     -delete:刪除查找到的文件     -fls file:查找到的所有文件的長格式資訊保存至指定文件中     -ok COMMAND {} \;對查找到的每個文件執行由 COMMAND 指定的命令。對於每個文件執行命令之前,都會互動式要求用戶確認。     -exec COMMAND {} \; 對查找到的每個文件執行由 COMMAND 指定的命令。       {}:用於引用查找到的文件名稱自身       find 傳遞查找到的文件至後面指定的命令時,查找到所有符合條件的文件一次性傳遞給後面的命令。

  1> 根據文件名和 inode 查找:

-name "文件名稱":支援使用 glob
  *,?,[ ],[^]
-iname "文件名稱":不區分字母大小寫
-inum n:按 inode 號查找
-samefile name:相同 inode 號的文件
-links n:鏈接數為 n 的文件
-regex "PATTERN":以 PATTERN 匹配整個文件路徑字元串,而不僅僅是文件名稱。

  2> 根據屬組、屬主查找:

-user USERNAME:查找屬主為指定用戶(UID)的文件
-group GRPNAME:查找屬組為指定組(GID)的文件
-uid UserID:查找屬主為指定的 UID 號的文件
-nouser:查找沒有屬主的文件
-nogroup:查找沒有屬組的文件

  3> 根據文件類型查找:

-type TYPE:
  f:普通文件
  d:目錄文件
  l:符號鏈接文件
  s:套接字文件
  b:塊設備文件
  c:字元設備文件
  p:管道文件
空文件或目錄
-empty
# 例:
# find /etc/ -name passwd                # 查找/etc/目錄下名為 passwd 的文件
/etc/passwd
/etc/pam.d/passwd

#
find /etc/ -maxdepth 1 -name passwd # maxdepth 指定最大深度,mindepth 相反指定最小深度 /etc/passwd
#
find /data/ -name f1 # 搜索/data 目錄下文件名為 f1 的文件,也可以使用 "*f1" 指包含 f1 的文件名(通配符)
#
find /home -user yang # 查找屬主為 yang 的文件
# find /home -nouser -o -nogroup # -o 或者

# 找出/tmp 目錄下,屬主不是 root,且文件名不以 f 開頭的文件: find /tmp \( ! -user root -a ! -name 'f*' \) -ls find /tmp ! \( -user root -o -name 'f*' \) -ls
# 排除目錄示例:
# 查找/etc/下,除/etc/sane.d 目錄的其他所有.conf 後綴的文件
# find /etc -path '/etc/asne.d' -a -prune -o -name "*.conf"    # -path '/etc/asne.d' -a -prune 如果是這個目錄剪切掉

# 查找
/etc/下,除/etc/sane.d 和/etc/fonts 兩個目錄的所有.conf 後綴的文件 # find /etc \( -path '/etc/sand.d' -o -path '/etc/fonts' \) -prune -o -name "*.conf" # \( -path "/etc/sane.d" -o -path "/etc/fonts" \) # 過濾多個目錄 # 查找/data/目錄下 的空文件夾
# find /data -type d -empty # find /home -type d -maxdepth 1 # find /data/ -empty -type f -ls # 查找目錄下空文件,-ls 列出長屬性

  4> 組合條件、德摩根定律

組合條件:
  與:-a
  或:-o
  非:not,! 德摩根定律: (非 A)或(非 B)= 非(A 且 B) (非 A)且(非 B)= 非(A 或 B)
# 例:
!A -a !B = !(A -o B)  !A -o !B = !(A -a B)
# find /data/ ! \( -empty -o -type f \)    # 查找/data目錄下不是空文件

  5>根據文件大小來查找:

-size [+|-]#UNIT     # 按單位搜索,搜索出來的並不是精確的
  常用單位:k,M,G,c(byte)
  #UNIT: (#-1,#]
    如:6k 表示(5k,6k]
  -UNIT: [0,#-1]
    如:-6k 表示[0,5k]
  +UNIT: (#,00)
    如:+6k 表示(6k,00

 

  6> 根據時間戳查找:

以 "天" 為單位:
-atime [+|-]#
  -#:[0,#) #:[#,#+1) +#:[#+1,00]-mtime -ctime
以 "分鐘" 為單位:
-amin -mmin -cmin

  7> 根據許可權查找:

-prem [/|-]MODE
  MODE:精確許可權匹配
    # find -prem 755 會匹配許可權模式恰好是 755 的文件
  /MODE:任何一類(u,g,o)對象的許可權中只要能一位匹配即可,或關係,+從 centos7 開始淘汰
    # find /data/ -perm /666 -ls    # 三者之間是或的關係
  -MODE:每一類對象都必須同時擁有指定許可權,與關係
  /和-的時候,0 表示不檢查 1 表示檢查(二進位);-是交集,/是並集
  只要當每個人有寫許可權時,find -perm +222 就會匹配
  只有當每個人都有寫許可權時,find -perm -222 才會匹配
  只有當其他人(other)有寫許可權時,find -prem -002 才會匹配

  8> 參數替換:xargs

由於很多命令不支援管道|來傳遞參數,而日常工作中有這個必要,所以就有了 xargs 命令
xargs 用於產生某個命令的參數,xargs 可以讀入 stdin 的數據,並且以空格符或回車符將 stdin 的數據分隔成為 arguments
注意:文件名或者是其他意義的名詞內含有空格符的情況
有些命令不能接受過多參數,命令執行可能會失敗,xargs 可以解決

# 例:
echo f{1..100000} | xargs -n1 touch # -n 表示一次傳一個參

 

# 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 {} \;
# 查找
/data 下的許可權為 644 ,後綴為 sh 的普通文件,增加執行許可權 # find /data -type f -perm 644 -name "*.sh」 -exec chmod 755 {} \;
# 查看/home 的目錄 # find /home -type d -ls

 

3、壓縮和解壓縮

  1> compress [-dcv] [file…](.Z)    # 老舊
  新系統默認不安裝,若要學習,需要安裝包:yum install ncompress -y
    -d:解壓縮,相當於 uncompress
    -c:結果輸出至標準輸出(螢幕),不刪除原文件,後可重定向至文件
    -v:顯示詳情
    uncompress 解壓縮
    zcat file.Z >file    # zcat 也是解壓縮 file.Z 壓縮包輸出資訊至螢幕,後跟重定向至文件

示例:
[root@centos7 ~]#ls
file
[root@centos7 ~]#compress file    # 默認刪除原文件,compress -c file >file.Z 重定向可以保留原文件
[root@centos7 ~]#ls
file.Z
[root@centos7 ~]#compress -d file.Z
[root@centos7 ~]#ls
file

  2> gzip [OPTION]…FILE…(.gz)
    -d:解壓縮,相當於 gunzip
    -c:將壓縮或解壓縮的結果輸出至標準輸出(螢幕)
    -#:1-9,指定壓縮比,值越大壓縮比越大
    zcat:不顯示解壓縮的前提下查看文本文件內容

示例:
gzip file                 # 壓縮文件(大概為-6),-d 解壓縮文件(默認刪除原文件)
gzip -c file >file.gz     # 使用-c 重定向標準輸出至文件可保留原文件
gzip -c -d file.gz >file  # 解壓縮+重定向
zcat file.gz >file        # 相當於解壓縮重定向

  3> bzip2 [OPTION]…FILE…(.bz2)
    -k:keep,保留原文件
    -d:解壓縮
    -#:1-9,壓縮比,默認為 9
    bzcat:不顯示解壓縮的前提下查看文本文件內容

  4> xz [OPTION]…FILE…(.xz)
    -k:keep,保留原文件
    -d:解壓縮
    -#:1-9,壓縮比,默認為 6
    xzcat:不顯示解壓縮的前提下查看文本文件內容

4、zip/unzip 打包壓縮

打包壓縮
zip -r /testdir/sysconfig /etc/sysconfig/    # 壓 縮 /etc/sysconfig/ 文件夾到/testdir/sysconfig 文件(-r 壓縮目錄,不跟-r 壓縮文件)
解包解壓縮
unzip sysconfig.zip
cat /var/log/messages | zip messages –       # 把前面的標準輸出傳到後面
unzip -p message > message

 

5、 tar 打包工具
  tar(Tape Archive,磁碟歸檔的縮寫)
  tar [OPTION]…

  1> 創建歸檔

tar -cpvf /PATH/TO/SOMEFILE.tar FILE…    # -c 創建打包文件 f 後跟文件名 p 保留屬性 v 顯示資訊
du -sh 顯示原有文件夾大小,ll -h 顯示打包後文件大小,大小不變
tar -tvf -t 預覽打包文件 -x 解壓縮(tar -xvf data.tar -C /tmp/ -C 跟解壓目錄)

  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 那些文件不打包 cat list.txt # 可以將打包的文件放在一個文件中 /etc/ /boot/ cat exlist.txt # 將排除的文件也放在一個文件中 /etc/shadow /boot/symvers-3.10.0-693.el7.x86_64.gz
tar zcvf list.tar.gz -T list.txt -X exlist.txt # 過濾打包
分割大的 tar 文件為多份小文件 split -b size -d tar-file-name(文件名稱) prefix-name(前綴) split -b 10M -d list.tar.gz a.tar # -b 切割成 10M 一個文件,-d 指定後綴為數字 -rw-r--r--. 1 root root 10485760 28 13:22 a.tar00 -rw-r--r--. 1 root root 10485760 28 13:22 a.tar01 …… -rw-r--r--. 1 root root 2855994 28 13:22 a.tar09 合併: cat a.tar0* >a.tar.gz # 查看重定向至文件

  6> 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

 

Tags: