通過 find 命令找到你要找的東西

2020-03-06 11:39:00

find 命令有巨多的選項可以幫助你準確定位你在 Linux 系統上需要尋找的檔案。這篇文章討論了一系列非常有用的選項。

在 Linux 系統上有許多用於查詢檔案的命令,而你在使用它們時也有巨多的選項可以使用。

例如,你不僅可以通過檔案的名稱來查詢檔案,還可以通過檔案的所有者或者組、它們的建立時間、大小、分配的許可權、最後一次存取它們的時間、關聯的資訊節點,甚至是檔案是否屬於系統上不再存在的帳戶或組等等來查詢檔案。

你還可以指定搜尋從哪裡開始,搜尋應該深入到檔案系統的什麼位置,以及搜尋結果將告訴你它所找到的檔案的數量。

而所有這些要求都可以通過 find 命令來處理。

下面提供了根據這些要求查詢檔案的範例。在某些命令中,錯誤(例如試圖列出你沒有讀取許可權的檔案)輸出將被傳送到 /dev/null,以便我們不必檢視它。或者,我們可以簡單地以 root 身份執行以避免這個問題。

請記住,還有更多的其他選項。這篇文章涵蓋了很多內容,但並不是 find 命令幫助你定位查詢檔案的所有方式。

選擇起點

使用 find,你可以選擇一個起點或從你所在的位置開始。要選擇的搜尋的起點,請在單詞 find 後輸入它。例如,find /usrfind ./bin 將在 /usr 目錄或當前位置下的 bin 目錄開始搜尋,而 find ~ 將在你的主目錄中開始搜尋,即使你當前位於當前檔案系統中的其他位置。

選擇你要找的

最常用的搜尋策略之一是按名稱搜尋檔案。這需要使用 -name 選項。

預設情況下,find 會顯示找到的檔案的完整路徑。如果你在命令中新增 -print,你會看到同樣的結果。如果你想檢視與檔案相關的詳細資訊—-例如:檔案的長度、許可權等,你需要在你的 find 命令的末尾新增 -ls 引數。

$ find ~/bin -name tryme/home/shs/bin/tryme$ find ~/bin -name tryme -print/home/shs/bin/tryme$ find ~/bin -name tryme -ls   917528   4 -rwx------   1 shs    shs   139 Apr  8  2019 /home/shs/bin/tryme

你也可以使用子字串來查詢檔案。例如,如果你將上面範例中的 tryme 替換為 try*,你將會找到所有名稱以 try 開頭的檔案。(LCTT 譯註:如果要使用萬用字元 * ,請將搜尋字串放到單引號或雙引號內,以避免萬用字元被 shell 所解釋)

按名稱查詢檔案可能是 find 命令最典型的用法,不過還有很多其他的方式來查詢檔案,並且有這樣做的需要。下面的部分展示了如何使用其他可用的方式。

此外,當按檔案大小、組、索引節點等條件來搜尋檔案時,你需要確認找到的檔案與你要查詢的檔案是否相匹配。使用 -ls 選項來顯示細節是非常有用。

通過大小查詢檔案

按大小查詢檔案需要使用 -size 選項並且對相應規範使用一點技巧。例如,如果你指定 -size 189b,你將找到 189 個塊大小的檔案,而不是 189 個位元組。(LCTT 譯註:如果不跟上單位,預設單位是 b。一個塊是 512 個位元組大小,不足或正好 512 個位元組將佔據一個塊。)對於位元組,你需要使用 --size 189c(字元)。而且,如果你指定 --size 200w ,你將會找到 200 個“word”的檔案——以“雙位元組增量”為單位的字,而不是“我們互相談論的那些事情”中的單詞。你還可以通過以千位元組(k)、兆位元組(M)和千兆位元組(G)為單位提供大小來查詢檔案。(LCTT 譯註:乃至還有 TP

大多數情況下,Linux 使用者會搜尋比選定大小要大的檔案。例如,要查詢大於 1 千兆位元組的檔案,你可以使用這樣的命令,其中 +1G 表示“大於 1 千兆位元組”:

$ find -size +1G -ls 2>/dev/null  787715 1053976 -rw-rw-r-- 1 shs  shs  1079263432 Dec 21  2018 ./backup.zip  801834 1052556 -rw-rw-r-- 1 shs  shs  1077809525 Dec 21  2018 ./2019/hold.zip

通過索引節點號查詢檔案

你可以通過用於維護檔案後設資料(即除檔案內容和檔名之外的所有內容)的索引節點來查詢檔案。

$ find -inum 919674 -ls 2>/dev/null  919674  4 -rw-rw-r--  1 shs  shs   512 Dec 27 15:25 ./bin/my.log

查詢具有特定檔案所有者或組的檔案

按所有者或組查詢檔案也非常簡單。這裡我們使用 sudo 來解決許可權問題。

$ sudo find /home -user nemo -name "*.png" -ls 1705219  4 drwxr-xr-x  2 nemo nemo  4096 Jan 28 08:50 /home/nemo/Pictures/me.png

在下面這個命令中,我們尋找一個被稱為 admins 的多使用者組擁有的檔案。

# find /tmp -group admins -ls   262199      4 -rwxr-x---   1 dory     admins         27 Feb 16 18:57 /tmp/testscript

查詢沒有所有者或組的檔案

你可以使用如下命令所示的 -nouser 選項來查詢不屬於當前系統上的任何使用者的檔案。

# find /tmp -nouser -ls262204 4 -rwx------ 1 1016 1016 17 Feb 17 16:42 /tmp/hello

請注意,該列表顯示了舊使用者的 UID 和 GID,這清楚地表明該使用者未在系統上定義。這種命令將查詢帳戶已從系統中刪除的使用者建立在主目錄之外的檔案,或者在使用者帳戶被刪除後而未被刪除的主目錄中建立的檔案。類似地,-nogroup 選項也會找到這樣的檔案,尤其是當這些使用者是相關組的唯一成員時。

按上次更新時間查詢檔案

在此命令中,我們在特定使用者的主目錄中查詢過去 24 小時內更新過的檔案。sudo 用於搜尋另一個使用者的主目錄。

$ sudo find /home/nemo -mtime -1/home/nemo/home/nemo/snap/cheat/home/nemo/tryme

按上次更改許可權的時間查詢檔案

-ctime 選項可以幫助你查詢在某個參考時間範圍內狀態(如許可權)發生更改的檔案。以下是查詢在最後一天內許可權發生更改的檔案的範例:

$ find . -ctime -1 -ls   787987   4 -rwxr-xr-x   1 shs   shs     189 Feb 11 07:31 ./tryme

請記住,顯示的日期和時間只反映了對檔案內容進行的最後更新。你需要使用像 stat 這樣的命令來檢視與檔案相關聯的三個狀態(檔案建立、修改和狀態更改)。

按上次存取的時間查詢檔案

在這個命令中,我們使用 -atime 選項查詢在過去兩天內存取過的本地 pdf 檔案。

$ find -name "*.pdf" -atime -2./Wingding_Invites.pdf

根據檔案相對於另一個檔案的時間來查詢檔案

你可以使用 -newer 選項來查詢比其他檔案更新的檔案。

$ find . -newer dig1 -ls   786434     68 drwxr-xr-x  67 shs      shs         69632 Feb 16 19:05 .  1064442      4 drwxr-xr-x   5 shs      shs          4096 Feb 16 11:06 ./snap/cheat   791846      4 -rw-rw-r--   1 shs      shs           649 Feb 13 14:26 ./dig

沒有相應的 -older 選項,但是你可以用 ! -newer (即更舊)得到類似的結果,它們基本上一樣。

按型別查詢檔案

通過檔案型別找到一個檔案,你有很多選項——常規檔案、目錄、塊和字元檔案等等。以下是檔案型別選項列表:

b      塊特殊檔案(緩衝的)c      字元特殊檔案(無緩衝的)d      目錄p      命名管道(FIFO)f      常規檔案l      符號連結s      通訊端

這裡有一個尋找符號連結的例子:

$ find . -type l -ls   805717   0 lrwxrwxrwx   1 shs    shs    11 Apr 10  2019 ./volcano -> volcano.pdf   918552   0 lrwxrwxrwx   1 shs    shs     1 Jun 16  2018 ./letter -> pers/letter2mom

限制查詢的深度

-mindepth-maxdepth 選項控制在檔案系統中搜尋的深度(從當前位置或起始點開始)。

$ find -maxdepth 3 -name "*loop"./bin/save/oldloop./bin/long-loop./private/loop

查詢空檔案

在這個命令中,我們尋找空檔案,但不進入目錄及其子目錄。

$ find . -maxdepth 2 -empty -type f -ls   917517      0 -rw-rw-r--   1 shs   shs      0 Sep 23 11:00 ./complaints/newfile   792050      0 -rw-rw-r--   1 shs   shs      0 Oct  4 19:02 ./junk

按許可權查詢檔案

你可以使用 -perm 選項查詢具有特定許可權集的檔案。在下面的範例中,我們只查詢常規檔案(-type f),以避免看到符號連結,預設情況下符號連結被賦予了這種許可權,即使它們所參照的檔案是受限的。

$ find -perm 777 -type f -lsfind: ‘./.dbus’: Permission denied   798748      4 -rwxrwxrwx   1 shs      shs            15 Mar 28  2019 ./runme

使用查詢來幫助你刪除檔案

如果使用如下命令,你可以使用 find 命令定位並刪除檔案:

$ find . -name runme -exec rm {} \;

{} 代表根據搜尋條件找到的每個檔案的名稱。

一個非常有用的選項是將 -exec 替換為 -ok。當你這樣做時,find 會在刪除任何檔案之前要求確認。

$ find . -name runme -ok rm -rf {} \;< rm ... ./bin/runme > ?

刪除檔案並不是 -ok-exec 能為你做的唯一事情。例如,你可以複製、重新命名或移動檔案。

確實有很多選擇可以有效地使用 find 命令,毫無疑問還有一些在本文中沒有涉及到。我希望你已經找到一些新的,特別有幫助的。