透過 find 命令找到你要找的東西
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 -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 中國”官方小程式來檢視
相關文章
- 如何透過六西格瑪尋找問題根源?
- 透過 AI/搜尋學東西會快很多的AI
- 如何找短視訊素材?這些工具可以幫到你
- 通過程式找sqlSQL
- 給找 Bug 的工具(larastan)找 BugAST
- 滲透中尋找突破口的那些事
- 通過埠號找程式ID
- Linux 命令列下的好東西Linux命令列
- 通過外來鍵找主鍵
- Android,你要掌握的一些東西Android
- win10系統使用搜尋框找東西一直在載入的解決方法Win10
- 為什麼要“東數西算”?
- 影像匹配(大圖中找小圖)之find_template原始碼解析原始碼
- 如何找東西?查詢演算法之順序查詢和二分查詢詳解演算法
- 為什麼要謹慎使用Linux find命令?Linux
- 老司機如何找素材,如何找靈感?
- 挖掘機哪家強?不找藍翔找AI!AI
- 遊戲人創業,投資不找老東家遊戲創業
- 找0的個數
- 確認過眼神,沙沙野有我要找的圖(無版權圖片、視訊網站)網站
- 找質數
- 找矩陣矩陣
- 尋找真凶
- 尋找社友之前發過的一篇文章
- 三星推出SmartThings智慧追蹤器 可透過LTE網路尋找遺失物品
- 使用grep命令,玩轉程式碼審計尋找Sink
- php的工作真難找PHP
- 尋找有生命的行星
- 如何正確的找BUG
- 影像匹配(大圖中找小圖)最簡單方法:aircv之find_templateAI
- find命令
- LeetCode 389——找不同LeetCode
- 尋找邊境
- 生活自媒體素材從哪找?找素材看這個
- 透過vconfig命令配置VLAN
- 在哪裡採集自媒體素材?他們找素材都是這樣找的
- 寫給自己看的找素材
- 尋找陣列的中心索引陣列索引