在Linux的世界當中,檔案尋找是最普遍的功能,然後該功能卻有著極其複雜的命令與參數相匹配。檔案尋找有大致三個以下命令:
其中難易程度之首為find,下面我們就來細說下find的命令用法,以及我收集的常用案例。
find命令的基本形式:
find pathname -options [-print -exec -ok]
- pathname :find命令所尋找的目錄路徑。例如用.來表示目前的目錄,用/來表示系統根目錄。
- -print :對匹配的檔案輸出到標準輸出,該命令一般會和xargs來搭配使用(在後面我們會說到)。
- -exec :對匹配的檔案執行所給出的shell命令。
- -ok :與-exec作用相同,只不過以一種更為安全的模式來執行shell命令,例如當執行rm命令的時候,會提示是否刪除。
find命令的參數選項:
- -name :按照檔案名稱來尋找檔案。
- -perm :按照檔案許可權來尋找檔案。
- -mtime :按照變更檔資料的天數來尋找檔案。其中附加參數為:n (當前n天)、-n(n天以內)、+n(n天以前)。具體我會在下面的案例來細講。
- -mmin :按照變更檔資料的分鐘來尋找檔案。附參數同上。
- -atime :按照訪問檔案的天數來尋找檔案。附參數同上。
- -amin :按照訪問檔案的分鐘來尋找檔案。附參數同上。
- -ctime :按照變更檔狀態的天數來尋找檔案。附參數同上。
- -cmin :按照變更檔狀態的分鐘來尋找檔案。附參數同上。
- -size :按照檔案大小來尋找檔案。
- -depth :在尋找檔案時,遍曆完目前的目錄檔案郵件後,在對其子目錄進行尋找。
- -type :按照檔案類型來尋找檔案。f - 普通檔案、d - 目錄、l - 符號連結檔案、b - 塊裝置檔案、c - 字元裝置檔案、p - 管道檔案。
- -newer :比對檔案的新舊。
- -user :根據使用者名稱來查詢檔案。
- -maxdepth : 限制查詢目錄的深度。
-exec 詳解:
我們尋找檔案的目的就是為了對其的後續操作,如查看、刪除、修改許可權等等之類的操作。這就是-exec的作用所在。其中使用-exec時不得不說的兩個關鍵字:{} 與\;。
顯示目前的目錄中,許可權為774的所有檔案,並顯示其相關資訊。
# find . -type f -perm 774 -exec ls -l {} \;
- {}代表的是“由find找到的內容”,如所示,find的結果會被放置到{}位置中。
- -exec一直到“\;”是關鍵字,代表find額外命令的開始(-exec)到結束(\;),在這中間的就是find命令內的額外命令。就是本例中的“ls -l {}”
- 因為“;”在bash環境下是有特殊意義的,因此利用反斜線來轉義。
find命令案例:
1、尋找目前使用者目錄下的所有檔案
# find $HOME -print# find ~ -print
2、尋找當天所修改過的檔案
# find / -type f -mtime 0 -exec ls -l {} \;
以上的命令並不是完全的正確,因為0代表目前的時間。也就是從現在到24小時前。還有就是盡量不要使用/根目錄開頭,原因應該大家都知道-_-!。
3、尋找/var/logs目錄中3天前所修改的檔案,並刪除。
# find /var/logs -type f -mtime +3 -ok rm {} \;
在這裡需要說明的有兩點,關於時間的 -符號、+符號、和沒有符號的區別。
以上的草圖我想已經很清楚其區別了。
- -3 :代表過去3天內。
- +3 :代表過去3天前。
- 3 :代表過去3天前的當天。
另一個就是-ok,在使用-ok刪除檔案的時候,它會詢問你是否刪除,反之使用-exec的話就直接刪除掉了。
4、尋找目前的目錄中檔案大於50kb的檔案,並顯示。
# find . -type f -size +50k -exec ls -l {} \;
- k :代表1024bytes。
- c :代筆byte(位元組)。
- +50k :大於50kb的檔案。
- -50k :小於50kb的檔案。
- 50 :等於50kb的檔案。
5、尋找許可權為755的檔案,並顯示
# find . -perm 755 -exec ls -l {} \;
6、查詢尾碼txt的目錄,且不遍曆子目錄
# find . -maxdepth 1 -name "*.txt" -exec ls -l {} \;
檔案尋找之locate
locate [-ir] keyword
- -i :忽略大小寫差異。
- -r :後面可接Regex。
locate的檔案尋找要比find命令快。之所以快是因為locate尋找的資料是由已建立的資料庫/var/lib/mlocate裡面的資料所尋找到的,所以不用直接在去硬碟當中訪問資料。但locate有其自己的限制。
那麼有什麼限制呢?就是因為它是經由資料庫來尋找的,而資料庫的建立預設是每天執行一次(每個distribution都不同,CentOS 5.x是每天更新資料庫一次),所以當你建立檔案後尋找該檔案,那麼locate會告訴你“找不到”。
那是否可以手動更新資料庫嗎?答案當然是可以。
# updatedb
使用上述命令就可以更新資料庫。updatedb命令會去讀取/etc/updatedb.conf這個設定檔的設定。