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 2 月 8 13:22 a.tar00 -rw-r--r--. 1 root root 10485760 2 月 8 13:22 a.tar01 …… -rw-r--r--. 1 root root 2855994 2 月 8 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