find 命令有巨多的選項可以幫助你準確定位你在 Linux 系統上需要尋找的檔案。這篇文章討論了一系列非常有用的選項。
在 Linux 系統上有許多用於查詢檔案的命令,而你在使用它們時也有巨多的選項可以使用。
例如,你不僅可以通過檔案的名稱來查詢檔案,還可以通過檔案的所有者或者組、它們的建立時間、大小、分配的許可權、最後一次存取它們的時間、關聯的資訊節點,甚至是檔案是否屬於系統上不再存在的帳戶或組等等來查詢檔案。
你還可以指定搜尋從哪裡開始,搜尋應該深入到檔案系統的什麼位置,以及搜尋結果將告訴你它所找到的檔案的數量。
而所有這些要求都可以通過 find
命令來處理。
下面提供了根據這些要求查詢檔案的範例。在某些命令中,錯誤(例如試圖列出你沒有讀取許可權的檔案)輸出將被傳送到 /dev/null
,以便我們不必檢視它。或者,我們可以簡單地以 root 身份執行以避免這個問題。
請記住,還有更多的其他選項。這篇文章涵蓋了很多內容,但並不是 find
命令幫助你定位查詢檔案的所有方式。
使用 find
,你可以選擇一個起點或從你所在的位置開始。要選擇的搜尋的起點,請在單詞 find
後輸入它。例如,find /usr
或 find ./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 個“字”的檔案——以“雙位元組增量”為單位的字,而不是“我們互相談論的那些事情”中的單詞。你還可以通過以千位元組(k
)、兆位元組(M
)和千兆位元組(G
)為單位提供大小來查詢檔案。(LCTT 譯註:乃至還有 T
、P
)
大多數情況下,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
命令,毫無疑問還有一些在本文中沒有涉及到。我希望你已經找到一些新的,特別有幫助的。