Linux 查詢檔案工具find
find命令是從指定位置進行遍歷查詢(可以理解為對檔案和目錄進行逐一查詢)
find可以查詢具有某一類特徵的檔案(例如查詢具有某個許可權特徵的檔案等),非常適合於批量處理具有某一類特徵的檔案
###################################################################
命令格式
#fine [path] [expression]
引數意義如下:
path:find查詢路徑。如果為指定,則預設為當前工作目錄
Expression:用於定義find查詢的表示式,表示式通常由選項、測試和動作3類引數組成
選項用於指定find查詢的目錄、幫助等資訊
常用選項極其含義如下
選項 |
說明 |
help |
獲得find命令的幫助資訊 |
depth |
先從當前目錄中查詢,然後再從當前目錄短的子目錄中查詢 |
maxdepth LEVELS |
向下搜尋到第LEVELS層目錄,當LEVLES=0時表示只在當前目錄查詢 |
mindepth LEVELS |
至少向下搜尋LEVELS層目錄 |
mount |
不搜尋遠端檔案系統(搜尋遠端檔案系統將花費大量的網路資源) |
follow |
搜尋如果遇到連結檔案就連同連結所指向的檔案一併檢查 |
大多數情況下,Linux管理員更像搜尋到具有某一類特徵的檔案,這時表示式應當使用一些測試引數,測試引數
常用的測試引數及含義如下
測試 |
說明 |
name |
按檔名查詢 |
perm |
按檔案許可權查詢 |
type |
查詢某一型別的檔案 |
mtime+n-n |
按檔案修改的時間查詢,+n表示修改時間據現在n天以前,-n表示修改時間據現在n天以內 |
atime+n-n |
按檔案的訪問時間查詢檔案(使用方法與mtime引數相同) |
size n[c] |
查詢檔案長度為n塊的檔案,c表示檔案大小為n位元組的檔案 |
User |
按檔案屬主查詢 |
group |
按檔案屬組查詢 |
nouser |
查詢沒有有效屬主的檔案(檔案屬主在/etc/passwd檔案中不存在) |
nogroup |
查詢沒有有效屬組的檔案(檔案屬組在/etc/group檔案中不存在) |
動作引數指定find命令如何查詢和處理查詢的檔案,常用的動作有如下4種:
prune:不在指定目錄中查詢
print:將查詢到的檔案輸出到標準輸出
exec:對查詢到的檔案執行exec動作後附帶的Shell命令
ok:對查詢到的檔案執行ok動作後附帶的Shell命令,在每次執行前將提示使用者是否執行
find有許多引數,大多數情況下,使用該命令都至少要包含一個測試和一個動作,才能完成整個查詢任務。
################################################################
按檔名稱查詢
有時候管理員會忘記某一個檔案存放在社麼位置。可以使用name引數進行查詢,也可以使用檔名稱萬用字元配合查詢
1.使用name引數指定要查詢的檔名,並使用print引數將找到的檔案輸出
想要在/etc目錄下查詢Samba服務的配置檔案smb.conf
#find /etc -name "smb.conf" -print
2.使用name引數時,配合檔名萬用字元查詢檔案
想要查詢/etc目錄下所有的配置檔案
#find /etc -name "*.conf" -print
3.如果未指定查詢的目錄,find將在當前目錄中查詢
在當前目錄中查詢名為messages的檔案
#find -name "messages" -print
4.查詢前兩個字元是小寫字母,第3個字元是數字,後面是.d的檔案
如果想要在/etc查詢兩個小寫字母加一個數字,最後面是.d的檔案,可以使用下面這條命令
#find -etc -name "[a-z][a-z][0-9].d" -print
5.使用find命令查詢檔案時,使用操作符&將其放到後臺進行
在一個很大的檔案系統上進行查詢時,可能會花費很多時間,通常建議使用操作符&將find命令放到後臺執行
#find / -name "*.conf" -print &
###########################################################
按檔案許可權查詢
使用perm引數可以按照檔案的許可權進行查詢,使用此引數時,需要使用八進位制表示許可權。按許可權查詢檔案通常用在多使用者系統中,以便於發現可能導致洩密、不安全的內容等。
note:使用八進位制表示許可權的方法稱為絕對模式,絕對模式使用數字4表示讀許可權,2表示寫許可權,1表示執行許可權,使用多許可權時只需要將數值相加即可。使用3位數字表示多使用者許可權,從左到右分別表示檔案屬主、屬組和其他使用者許可權。
1.在整個檔案系統上查詢屬主可以讀、寫,屬組可以讀、寫,其他使用者可以讀的檔案:
在整個檔案系統上查詢許可權為664的檔案
#find / -perm 664 -print
2.在當前目錄的file子目錄下查詢其他使用者可以讀、寫、執行的檔案(這種情況下應當引起重視),此時應該在許可權數值前加一個橫槓“-”(“-”表示使用包含模式)
在當前目錄的file子目錄中查詢許可權中包含其他使用者可以讀、寫、執行的檔案
#find ./file -perm -007 -print
#########################################################3
按檔案型別查詢
用type引數可以按型別查詢檔案,常見的檔案型別有目錄、字元裝置檔案和普通檔案等。按檔案型別進行查詢適合於一些比較特殊的情況,例如要查詢某個裝置而不知道其具體的名稱等
1.查詢/dev下有哪些字元裝置,其中c表示字元裝置
#fine /dev -type c -print
2.查詢目錄/dev中的塊裝置檔案,其中b表示塊裝置檔案
#find /dev -type b -print
3.查詢目錄/etc/rc3.d中除了連結檔案以外的檔案(通常情況下這個目錄下只會存放連結檔案),其中l表示連結檔案,感嘆號!表示否定
#find /etc/rc3.d ! -type l -print
note:引數type使用的檔案標識除普通檔案使用f作為標識外,其他標識都與ls命令的長格式中的檔案型別標識一致,例如使用字母d表示目錄,l表示連結檔案等
############################################################33
按檔案的時間戳記和大小查詢
在管理和維護Linux系統的過程中,經常需要清理一些過期的日誌和檔案,清理這些檔案的標準通常是檔案的修改時間、訪問時間、檔案的大小等。而另一種情況是我們需要知道一定時間內被修改過的檔案,以便對這些檔案進行備份等。這時可以使用find命令的mtime、atime和size引數按檔案的時間戳記和檔案的長度查詢
1.按時間戳記查詢檔案
按檔案的時間戳記進行查詢時,可以使用+n限定時間在n天以前,使用-n限定時間在n天以前。雖然也可以使用n精確限定時間,但一般不這樣使用,原因是系統計算時間是以秒為計算單位的,因此一般情況下該選項無法得到任何有用的結果。
1.1使用-7指定修改時間在7天以內的檔案
希望在整個檔案系統上查詢修改時間在一週以內的檔案
#find / -mtime -7 -print
1.2使用+1指定修改時間在1天以前的檔案
查詢使用者根目錄下修改時間在1天以前的檔案
#find ~ -mtime +1 -print
1.3查詢目錄/data中訪問時間在10天以內的檔案
查詢目錄/data中訪問時間在10天以內的檔案
#find /data -atime -10 -print
2.按檔案長度查詢檔案
使用size按檔案大小查詢時,可以像按時間戳記那樣使用+n表示檔案長度大於n的檔案,-n表示檔案長度小於n的檔案。
預設情況下檔案長度的單位是塊(一塊等於512位元組),如果要以位元組來計算檔案長度,應該在數字後加上小寫字母c
2.1使用+10000000c表示檔案長度大於10MB的檔案
在當前目錄下查詢檔案長度大於10MB的檔案
#find . -size +10000000c -print
2.2使用-30表示檔案長度小於30塊(512*30=15KB)的檔案
要在當前目錄下查詢檔案長度小於30塊的檔案
#find . -size -30 -print
note:在按檔案大小查詢檔案時,也可以使用KB(千位元組)、MB(兆位元組)、GB(吉位元組)等較大的單位標誌檔案的大小。
#################################################################33
按檔案屬主或屬組查詢
當管理員將一個使用者或使用者組從系統中刪除時,可能需要將該使用者或使用者組的檔案收集起來儲存一段時間。這時可以使用find命令的user、nouser、group和nogroup這幾個引數,查詢指定使用者、使用者組的檔案。
1.使用user引數查詢屬主為lilei的檔案
要查詢目錄/home中屬主為lilei的檔案
#find /home -user lilei -print
2.使用nouser引數查詢沒有有效屬主的檔案
在整個檔案系統上查找出沒有有效屬主(即使用者名稱在系統使用者名稱/etc/passwd中不存在)的檔案
#find / -nouser -print
3.使用group引數查詢屬組為admin的檔案
查詢目錄/file中屬組為admin的檔案
#find /file -group admin -print
4.使用nogroup引數查詢沒有有效屬組的檔案
在整個檔案系統中查詢沒有有效屬組(即使用者組名稱在系統使用者組檔案/etc/group中不存在)的檔案
#find / -nogroup -print
###############################################3
在find命令中還存在一些其他引數,這些引數使用頻率較低(例如忽略某個目錄),但有時使用這些引數查詢檔案卻十分方便。
1.忽略目錄引數prune
在查詢檔案的時候,可能不需要查詢某個目錄,或使用者已經知道某個目錄中不存在這個檔案,這時就可以使用prune引數忽略這些目錄。
例如要從除了/etc以外的整個檔案系統上查詢以.conf結尾的檔案
使用path、prune和name引數指定在除了/etc以外的整個目錄中查詢以.conf結尾的配置檔案
#find / -path "/etc" -prune -o -name "*.conf" -print
在上面的示例中,使用引數o將兩個不同的引數連線起來
###################################################
使用exec和ok處理查詢到的檔案
在Linux管理和維護中,大多數時候查詢具有某一類特徵的檔案的目的是為了處理這些檔案,通常的處理方式有刪除、移動等,例如查詢並刪除一些舊的檔案或過期的日誌等,這時可以使用動作引數中的exec、ok,這兩個引數都可以對查詢到的檔案執行Shell命令,不同的是,使用ok引數執行較危險的Shell命令(例如刪除檔案命令rm)時會提示使用者
利用find命令查詢到檔案後,就可以使用exec、ok引數對查詢到的檔案執行Shell命令。使用exec、ok引數執行Shell命令的格式如下:
#-exec [Shell 命令] {} \;
#-ok [Shell命令] {} \;
在上面的格式中,引數exec、ok後面空一格緊跟要執行的Shell命令,再空一格後面是一個大括號“{}”,最後加上一個反斜槓“\”和一個分號";"
1.查詢當前目錄的backup_sys子目錄中,修改時間據現在一週以前、以message開頭的檔案,並用ls -l命令檢視:
#find ./backup_sys -name "message" -mtime +7 -exec ls -l {}\;
ls命令列出的檔案是相對於當前目錄的相對路徑
2.查詢並刪除兩週以前的備份檔案
#find ./backup_sys -name "message*" -mtime +14 -exec rm {}\;
3.如果要在執行Shell命令時獲得命令執行的提示,可以使用ok引數。例如刪除兩週以前的備份檔案並在執行前獲得提示
#find ./backup_sys -name "message*" -mtime +14 -ok rm {}\;
############################################################
使用xargs命令處理查詢到的檔案
利用exec和ok引數查詢到的檔案時,存在一些缺陷,這些缺陷如下:
系統對引數exec、ok傳遞給Shell命令的檔案列表長度有一定的·限制。當find命令查詢到的檔案數量很多時,會出現引數列表溢位錯誤。
引數對find命令找到的每一個檔案發起一個相應的處理程序,當find命令查詢到的檔案數量很多時,可能會影響整個系統性能。
xargs命令的作用是構造一個引數列表並交給命令執行。與引數exec、ok相比,xargs不會一次獲取並處理find找到的所有檔案,而是每次只獲取並處理其中的一部分。處理完後在獲取下一部分,直至結束。這個過程xargs都只發起一個處理程序,對系統性能的影響很小。
使用xargs命令分割引數列表時,需要藉助於管道。
例如查詢當前目錄的backup_sys子目錄時,修改時間據現在兩週以前的所有檔案並刪除:
#find ./backup_sys -name "message*" -mtime +14 -print | xargs rm
這條命令首先使用find查找出相應的檔案。然後使用管道傳遞給xargs,xargs命令構造引數列表之後再傳遞給rm命令執行刪除操作