1. 程式人生 > >Linux 查詢檔案工具find

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命令執行刪除操作