find命令詳解

前提

    Linux秉承着“一切皆文件”的哲學思想,當然這也是對linux文件系統的一種抽象說法,從設備驅動程序、目錄、系統配置、內核參數到任務進程都是用文件來表示的。其中的任何事物,無論是純文本文件(例如/etc/hosts)、塊設備或字符設備驅動程序或者內核狀態與配置(例如/proc/cpuinfo),他們都用文件的形式表示。 一切皆文件,這意味着從系統的一部分學到的原理可以適用於系統的其他部分。

   所以怎麼查找文件就顯得非常重要了,今天我們就來詳細的學習一下find命令的用法。

      find命令用來在指定目錄下查找文件。任何位於參數之前的字符串都將被視爲欲查找的目錄名。如果使用該命令時,不設置任何參數,則find命令將在當前目錄下查找子目錄與文件。並且將查找到的子目錄和文件全部進行顯示。

語法

·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \

  find      (指定目錄)     (指定選項)                                 [查找玩之後執行的動作 ]

常用選項

-amin<分鐘>:查找在指定時間曾被存取過的文件或目錄,單位以分鐘計算;

-anewer<參考文件或目錄>:查找其存取時間較指定文件或目錄的存取時間更接近現在的文件或目錄;

-atime<24小時數>:查找在指定時間曾被存取過的文件或目錄,單位以24小時計算;

-cmin<分鐘>:查找在指定時間之時被更改過的文件或目錄;

-cnewer<參考文件或目錄>查找其更改時間較指定文件或目錄的更改時間更接近現在的文件或目錄;

-ctime<24小時數>:查找在指定時間之時被更改的文件或目錄,單位以24小時計算;

-daystart:從本日開始計算時間;

-depth:從指定目錄下最深層的子目錄開始查找;

-expty:尋找文件大小爲0 Byte的文件,或目錄下沒有任何子目錄或文件的空目錄;

-exec<執行指令>:假設find指令的回傳值爲True,就執行該指令;

-false:將find指令的回傳值皆設爲False;

-fls<列表文件>:此參數的效果和指定“-ls”參數類似,但會把結果保存爲指定的列表文件;

-follow:排除符號連接;

-fprint<列表文件>:此參數的效果和指定“-print”參數類似,但會把結果保存成指定的列表文件;

-fprint0<列表文件>:此參數的效果和指定“-print0”參數類似,但會把結果保存成指定的列表文件;

-fprintf<列表文件><輸出格式>:此參數的效果和指定“-printf”參數類似,但會把結果保存成指定的列表文件;

-fstype<文件系統類型>:只尋找該文件系統類型下的文件或目錄;

-gid<羣組識別碼>:查找符合指定之羣組識別碼的文件或目錄;

-group<羣組名稱>:查找符合指定之羣組名稱的文件或目錄;

-help或——help:在線幫助;

-ilname<範本樣式>:此參數的效果和指定“-lname”參數類似,但忽略字符大小寫的差別;

-iname<範本樣式>:此參數的效果和指定“-name”參數類似,但忽略字符大小寫的差別;

-inum<inode編號>:查找符合指定的inode編號的文件或目錄;

-ipath<範本樣式>:此參數的效果和指定“-path”參數類似,但忽略字符大小寫的差別;

-iregex<範本樣式>:此參數的效果和指定“-regexe”參數類似,但忽略字符大小寫的差別;

-links<連接數目>:查找符合指定的硬連接數目的文件或目錄;

-iname<範本樣式>:指定字符串作爲尋找符號連接的範本樣式;

-ls:假設find指令的回傳值爲Ture,就將文件或目錄名稱列出到標準輸出;

-maxdepth<目錄層級>:設置最大目錄層級;

-mindepth<目錄層級>:設置最小目錄層級;

-mmin<分鐘>:查找在指定時間曾被更改過的文件或目錄,單位以分鐘計算;

-mount:此參數的效果和指定“-xdev”相同;

-mtime<24小時數>:查找在指定時間曾被更改過的文件或目錄,單位以24小時計算;

-name<範本樣式>:指定字符串作爲尋找文件或目錄的範本樣式;

-newer<參考文件或目錄>:查找其更改時間較指定文件或目錄的更改時間更接近現在的文件或目錄;

-nogroup:找出不屬於本地主機羣組識別碼的文件或目錄;

-noleaf:不去考慮目錄至少需擁有兩個硬連接存在;

-nouser:找出不屬於本地主機用戶識別碼的文件或目錄;

-ok<執行指令>:此參數的效果和指定“-exec”類似,但在執行指令之前會先詢問用戶,若回答“y”或“Y”,則放棄執行命令;

-path<範本樣式>:指定字符串作爲尋找目錄的範本樣式;

-perm<權限數值>:查找符合指定的權限數值的文件或目錄;

-print:假設find指令的回傳值爲Ture,就將文件或目錄名稱列出到標準輸出。格式爲每列一個名稱,每個名稱前皆有“./”字符串;

-print0:假設find指令的回傳值爲Ture,就將文件或目錄名稱列出到標準輸出。格式爲全部的名稱皆在同一行;

-printf<輸出格式>:假設find指令的回傳值爲Ture,就將文件或目錄名稱列出到標準輸出。格式可以自行指定;

-prune:不尋找字符串作爲尋找文件或目錄的範本樣式;

-regex<範本樣式>:指定字符串作爲尋找文件或目錄的範本樣式;

-size<文件大小>:查找符合指定的文件大小的文件;

-true:將find指令的回傳值皆設爲True;

-typ<文件類型>:只尋找符合指定的文件類型的文件;

-uid<用戶識別碼>:查找符合指定的用戶識別碼的文件或目錄;

-used<日數>:查找文件或目錄被更改之後在指定時間曾被存取過的文件或目錄,單位以日計算;

-user<擁有者名稱>:查找符和指定的擁有者名稱的文件或目錄;

-version或——version:顯示版本信息;

-xdev:將範圍侷限在先行的文件系統中;

-xtype<文件類型>:此參數的效果和指定“-type”參數類似,差別在於它針對符號連接檢查。

常用示例

find

列出當前目錄及子目錄下所有文件和文件夾


  • 按照文件名查找:

find /home  -name "*.t?t"   *表示通配任意個字符  表示通配單個字符

列出/home 目錄下的以 .t t結尾的文件,兩個t中間爲一個字符。


  • 按照文件時間戳查找:

首先我們先簡要了解一下文件的時間戳的概念,可以用stat或者ls 命令查看文件的三個時間戳。

訪問時間Accessatime
修改時間Modifymtime
狀態改動時間Changectime


下面是man手冊中給予的(+ - n)的解釋:


我擷取了鳥哥linux私房菜中對正負號的解釋:

圖中最右邊爲目前的時間,越往左邊則代表越早之前的時間軸啦。由圖我們可以清楚的知道:

  • +4代表大於等於5天前的檔名:ex> find /var -mtime +4
  • -4代表小於等於4天內的檔案檔名:ex> find /var -mtime -4
  • 4則是代表4-5那一天的檔案檔名:ex> find /var -mtime 4

find   /usr   -mtime  -4   查找文件更新日時在距現在時刻4天以內的文件

find   /usr  -mtime  +4    查找文件更新日時在距現在時刻5天以上的文件

find   /usr   -mtime   4   查找文件更新日時在距現在時刻4天以上5天以內的文件


通過wc -l統計行數可以看出內容修改過的文件數符合正常的文件修改的規律。

  • 按照文件所有者和羣組來查找:

find  / -user mhy 


注意:find / -nouser  -a -nogroup  可以找出系統中不屬於任何人和任何羣組的文件,對於這些文件我們需要保持警惕。

這裏我們可以引申 -a -o -not的用法:

-o 是或者的意思  

-a 是而且的意思  

-not 是相反的意思  

通過這三個我們可以自由組合各種篩選選項或者規則。比如:列出/var目錄下屬於某個用戶的文件並且文件名包含a的文件。



  • 按照文件類型來查找文件:

find / -type p

列出所有的管道類型文件


  • 按照文件大小來查找文件:

 find  / -size  +10M

列出/usr中大於10M的文件


  • 按照文件權限來查找文件:

find /var -perm 777

列出/var目錄下文件權限爲777的文件


引申內容:

find查找後執行的命令

-print: find命令將匹配的文件輸出到標準輸出。
-exec: find命令對匹配的文件執行該參數所給出的shell命令。相應命令的形式爲'command' {}  \;,注意{ }和\;之間的空格。

-ok: 和-exec的作用相同,只不過以一種更爲安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。

注意一點:{}中的內容並非一次引用所有的搜索出的內容,而是一行一行引用。我也是在-exec tar -zcvf some.tar.gz {}  \;時發現的。

舉兩個例子:

查找一下/var/log目錄下內容更改時間40天前並且大於100K的文件,並列出他們的路徑。

 find /var/log   -mtime +40 -a -size +100k -exec ls -lh {} \;


查找一下/var/log目錄下內容更改時間30天前並且不屬於root羣組的文件,並提示是否刪除他們。

find /var/log -type f -a  -mtime  +30 -not -group root -ok rm -rf {} \;



好了,今天就寫到這裏了,本人不才,如有錯誤請讀者指出,十分感謝!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章