1. 程式人生 > 實用技巧 >shell-命令_find

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 {} \;

找出當前目錄下所有的普通檔案並顯示檔案行數(無需確認)