通過 find 命令找到你要找的東西
![](https://linuxstory.org/wp-content/uploads/2024/06/113842txki5llopb5aagbt-800x400.jpg)
在 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 -ls
262204 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 -ls
find: 『./.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
命令,毫無疑問還有一些在本文中沒有涉及到。我希望你已經找到一些新的,特別有幫助的。
作者:Sandra Henry-Stocker 選題:lujun9972 譯者:heguangzhi 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive