shell-命令_find
find命令主要是用來在相應的目錄下查詢符合給定條件的檔案。
# find [查詢起始路徑] [查詢條件] [處理動作]
find
支援檔名的正則表示式查詢
,按檔案修改時間查詢
,按檔案大小查詢
,按檔案許可權查詢
,按檔案型別查詢
等,查詢到以後還支援直接對查詢到的檔案使用命令
,功能非常強大
Find命令選項引數使用:
name選項(iname是不區分大小寫):
檔名選項是find命令最常用的選項,要麼單獨使用該選項,要麼和其他選項一起使用。可以使用某種檔名模式來匹配檔案,記住要用引號將檔名模式引起來。 不管當前路徑是什麼,如果想要在自己的家目錄、$HOME中查詢檔名符合*.log的檔案,使用‘~’作為 ‘pathname’引數,波浪號~代表了你的$HOME目錄。
# find ~ -name “*.log” 當前目錄: # find . –name “*.log” 絕對路徑: # find /etc -name “*.log” 以一個大寫字母開頭的檔案 # find . –name “[A-Z]*” 如果想在當前目錄查詢檔名以一個個小寫字母開頭,最後是4到9加上.log結束的檔案: 命令: # find . –name “[a-z]*[4-9].log”
perm選項:
按照檔案許可權模式用-perm選項,按檔案許可權模式來查詢檔案的話。最好使用八進位制的許可權表示法。 # find . -perm 755 還有一種表達方法:在八進位制數字前面要加一個橫槓-,表示都匹配,如-007就相當於777,-005相當於555。 # find . -perm -005
Prune選項:
如果在查詢檔案時希望忽略某個目錄,因為你知道那個目錄中沒有你所要查詢的檔案,那麼可以使用-prune選項來指出需要忽略的目錄。在使用-prune選項時要當心,因為如果你同時使用了-depth選項,那麼-prune選項就會被find命令忽略。
希望在qq目錄下查詢檔案,但不希望在test子目錄下查詢,可以用: # find qq -path "qq/test" -prune -o –print 避開多個資料夾: # find test \( -path test/test4 -o -path test/test3 \) -prune -o –print
圓括號表示表示式的結合。 \ 表示引用,即指示 shell 不對後面的字元作特殊解釋,而留給 find 命令去解釋其意義。
User和nouser選項:
按檔案屬主查詢檔案: # find ~ -user root 在/etc目錄下查詢檔案屬主為zs的檔案 # find /etc -user zs
為了查詢屬主帳戶已經被刪除的檔案,可以使用-nouser選項。
在/home目錄下查詢所有的這類檔案 (使用者ID不存在的檔案): # find /home –nouser
這樣就能夠找到那些屬主在/etc/passwd檔案中沒有有效帳戶的檔案。在使用-nouser選項時,不必給出使用者名稱; find命令能夠為你完成相應的工作
Group和nogroup選項:(同user和nouser類似)
按照更改時間或訪問時間等查詢檔案:
如果希望按照更改時間來查詢檔案,可以使用mtime,atime或ctime選項。如果系統突然沒有可用空間了,很有可能某一個檔案的長度在此期間增長迅速,這時就可以用mtime選項來查詢這樣的檔案。
用減號“-”來限定更改時間在距今n日以內的檔案,而用加號“+”來限定更改時間在距今n日以前的檔案。
查詢在系統指定目錄下更改時間在10日以內的檔案: # find /usr/local/src -mtime -10 在/var/log目錄下查詢更改時間在3日以前的檔案: # find /var/log -mtime +3 mtime (modification time ):在寫入檔案時隨檔案內容的更改而更改的時間(檔案的最後修改時間)。我們用ls -l看到的時間,就是mtime ctime (status time):是在寫入檔案、更改所有者、許可權或連結設定時隨Inode的內容更改而更改的時間(檔案最後改變時間)。相當於ls -l –time=ctime所看到的時間 atime (access time):讀取檔案或者執行檔案時更改的時間(檔案的最後訪問時間)。也就是用ls -l –time=atime看到的時間 以分鐘為單位與atime,ctime,mtime類似,對應的引數為amin, cmin,mmin 查詢某個新檔案或舊檔案: 如果希望查詢更改時間比某個檔案新但比另一個檔案舊的所有檔案,可以使用-newer選項。 它的一般形式為: newest_file_name ! oldest_file_name (其中,!是邏輯非符號。) 查詢更改時間比檔案log2017.log新但比檔案log2018.log舊的檔案 : # find -newer log2017.log ! -newer log208.log 查詢更改時間比檔案log2017.log新的檔案: # find . –newer log2017.log
Type選項:
在/root目錄下查詢所有目錄:
# find /root -type d
在當前目錄下查詢除了目錄以為的所有型別的檔案:
# find . ! -type d
在/root目錄下查詢符號連結檔案:
# find /root -type l
-type 檔案屬性
- d: 目錄
- f: 普通檔案
- l: 連結檔案(link)
- s: socket檔案
- p: 管道檔案(pipe)
- b: 塊裝置檔案
- c: 字元裝置檔案
Size選項:
可以按照檔案長度來查詢檔案,這裡所指的檔案長度既可以用塊(block)來計量,也可以用位元組來計量。以位元組計量檔案長度的表達形式為N c;以塊計量檔案長度只用數字表示即可。
在按照檔案長度查詢檔案時,一般使用這種以位元組表示的檔案長度,在檢視檔案系統的大小,因為這時使用塊來計量更容易轉換。
在當前目錄下查詢檔案長度大於1 M位元組的檔案 # find . -size +1000000c 在/home/目錄下查詢檔案長度恰好為100位元組的檔案: # find /home -size 100c 在當前目錄下查詢長度超過10塊的檔案(一塊等於512位元組) : # find . -size +10(小於就是-10) 查詢檔案size小於10k的檔案或目錄 # find / -size -10k 查詢檔案size小於10M的檔案或目錄 # find / -size -10M 查詢檔案size大於10G的檔案或目錄 # find / -size +10G
Depth選項:
在使用find命令時,可能希望先匹配所有的檔案,再在子目錄中查詢。使用depth選項就可以使find命令這樣做。這樣做的一個原因就是,當在使用find命令向備份檔案系統時,希望首先備份所有的檔案,其次再備份子目錄中的檔案。
也即他將先匹配所有的檔案然後在進入子目錄查詢。
Mount選項:
在當前的檔案系統中查詢檔案(不進入其他檔案系統),可以使用find命令的mount選項。
從當前目錄開始查詢位於本檔案系統中檔名以XC結尾的檔案 :
# find . -name "*.XC" –mount
組合查詢:
- -a: and
- -o: or
- -not
顯示當前目錄下所有目錄和連結檔案的詳細資訊
# find . -type d -a -type l -ls
其他選項:
- -print: 顯示
- -ls:類似ls -l的形式顯示每一個檔案的詳細
- -quit: 查詢到一個就退出
- -delete: 刪除匹配到的行
- -ok COMMAND {} \; 每一次操作都需要使用者確認,{}表示引用找到的檔案,是佔位符
- -exec COMMAND {} \; 每次操作無需確認
# find . -type d -delete
刪除當前目錄下的所有目錄
# find . -type f -ok wc -l {} \;
找出當前目錄下所有的普通檔案並顯示檔案行數(需確認)
# find . -type f -exec wc -l {} \;
找出當前目錄下所有的普通檔案並顯示檔案行數(無需確認)