Linux中國

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

在 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 -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 命令,毫無疑問還有一些在本文中沒有涉及到。我希望你已經找到一些新的,特別有幫助的。

via: https://www.networkworld.com/article/3527420/how-to-find-what-you-re-looking-for-on-linux-with-find.html

作者:Sandra Henry-Stocker 選題:lujun9972 譯者:heguangzhi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國