Linux 檔案搜尋神器 find 實戰詳解,建議收藏!

肖邦linux發表於2021-01-31

大家好,我是肖邦,這是我的第 10 篇原創文章。

在 Linux 系統使用中,作為一個管理員,我希望能查詢系統中所有的大小超過 200M 檔案,檢視近 7 天系統中哪些檔案被修改過,找出所有子目錄中的可執行檔案,這些任務需求 find 命令都可以輕鬆勝任。

在 Linux 系統檔案中常用的屬性可以分為以下內容:名稱、大小、許可權、屬主、修改時間、訪問時間等,find 命令可以按照指定的屬性為條件進行查詢。

廢話不多,直接開幹,下邊進入案例實戰。

案例實戰

(一)按檔名稱查詢

按照檔名稱查詢是 find 最常見的用法,需要注意的是,搜尋的檔名必須完全匹配,才能找到對應的檔案。

1. 查詢當前目錄下所有 go 檔案

$ find . -name "*.go"

2. 在 etc 目錄下,查詢大寫字母開頭的 txt 檔案

$ find /etc -name "[A-Z]*.txt" -print

3. 在當前目錄下查詢不是 out 開頭的 txt 檔案

$ find . -name "out*" -prune -o -name "*.txt" -print

4. 在當前目錄除 git 子目錄外查詢 txt 檔案

$ find . -path "./git" -prune -o -name "*.txt" -print

5. 找出某個檔案的所有硬連結,ls 命令 -i 選項可以檢視檔案的 inode 號

$ ls -i 1.txt
138956 1.txt
$ find . -num 138956

這裡補充一個小技巧,搜尋檔案時使用 -iname 引數可以忽略檔名稱大小寫

(二)按檔案型別查詢

1. 在當前目錄下,查詢軟連線檔案

$ find . -type l -print

2. 在當前目錄下,查詢 log 結尾的普通檔案,f 表示普通檔案型別

$ find . -type f -name "*.log"

(三)按檔案大小查詢

1. 查詢小於 64k 的檔案

$ find . -size -64k -print

2. 查詢大小超過 200M 的檔案

$ find . -size +200M -type f -print

(四)按時間查詢

1. 查詢 2 天內被修改過的檔案

$ find . -mtime -2 -type f -print

2. 查詢 2 天前被更改過的檔案,-mtime 表示內容修改時間

$ find . -mtime +2 -type f -print

3. 查詢一天內被訪問的檔案,-atime 表示訪問時間

$ find . -atime -1 -type f -print

4. 查詢一天內狀態被改變的檔案,-ctime 表示後設資料被變化時間

$ find . -ctime -1 -type f -print

5. 查詢比 chopin.txt 新的檔案

$ find . -newer "chopin.txt" -type f -print
$ find . ! -newer "chopin.txt" -type f -print # 舊

(五)根據許可權查詢

1. 查詢當前目錄許可權為 644 的檔案

$ find . -type f -perm 644

2. 查詢 etc 目錄下至少有一個使用者有寫許可權的檔案

$ find /etc -type f -perm /222

3. 查詢 etc 目錄下所有使用者都有執行許可權的檔案

$ find /etc -perm -111 -ls

(六)組合條件

1. 查詢當前目錄下屬於 chopin 使用者的普通檔案,-a 可以省略

$ find . -type f -a -user chopin -print

2. 查詢當前目錄下大於 2M 或 2 天前被修過的檔案

$ find . -size +2M -o -mtime +2 -print

3. 查詢當前目錄下不是普通檔案

$ find . -not -type f
$ find . ! -type f

4. 查詢非空檔案

$ find . ! -empty

(七)處理動作

find 根據上述各種條件查詢後,支援執行相關的處理動作,可以讓我們的更方便和靈活,而不只是列印出來

1. -print 預設為列印,可省略

$ find . -name "*.log" -print
$ find . -name "*.log" # 等價

2. -ls 以 ls 長檔案的格式形式輸出

$ find . -name "*.txt" -ls
138957      4 -rw-r--r--   1 root     root           16 Jan 24 23:20 ./a.txt
138959      4 -rw-r--r--   1 root     root          172 Jan 24 13:06 ./T.txt
138956      4 -rw-r--r--   1 root     root           27 Jan 24 23:28 ./1.txt

3. -delete 刪除查詢到的檔案

$ find . -size +100M -delete

4. -exec 將查詢到的檔案傳遞給 command 命令。下邊例子是將查詢到的檔案傳遞給了 ls 命令,同理我們可以傳遞給任何一個 Linux 命令,功能十分強大,也很靈活。

$ find . -name "*.txt" -exec ls -lh {} \;
-rw-r--r-- 1 root root 16 Jan 24 23:20 ./a.txt
-rw-r--r-- 1 root root 172 Jan 24 13:06 ./T.txt
-rw-r--r-- 1 root root 27 Jan 24 23:28 ./1.txt

5. -ok-exec 功能一樣,只是操作時會提示使用者確認,僅此而已。當然,在生產環境上,我們還是推薦使用 ok

(八)經典案例

如果存在一個名稱亂碼的檔案,想要刪除它,該怎麼辦?即使我們複製亂碼名稱到命令列,很有可能終端不能正確識別。不用擔心,下邊來展示下 find 是如何優雅的解決問題的。

$ ls  -i
138957 a.txt  138959 T.txt  132395 ڹ��.txt

$ find . -inum 132395 -exec rm {} \;

命令中,-inum 指定的是檔案的 inode 號,它是系統中每個檔案對應的唯一編號,find 通過編號找到後,執行刪除操作。

總結歸納

find 命令是 Linux 命令中最有用的命令之一,它的功能非常強大,且語法複雜。其實我們不一定需要了解它的所有細節,掌握上述實戰案例中的常見用法,足夠滿足日常工作中的大部分需求。

下邊我們一起來總結下 find 命令常見用法,加深對 find 使用方法的理解。

命令格式

find path -option [-exec ...]

按檔名查詢

  • -name:按照檔名稱查詢,準確匹配;
  • -iname:不區分檔名的大小寫;
  • -inode:按照檔案 inode 號查詢;

按照檔案型別查詢

按照檔案型別查詢,可以使用 -type 選項,具體支援的檔案型別如下:

  • f:普通檔案
  • d:目錄檔案
  • l:連結檔案
  • s:套接字檔案
  • p:管道檔案
  • b:塊裝置檔案,比如:磁碟
  • c:字元裝置檔案,比如:鍵盤、滑鼠、網路卡

按照檔案從屬關係查詢

  • -user:以使用者名稱查詢
  • -group:以組名查詢
  • -uid:以使用者 ID 查詢
  • -gid:以組 ID 查詢
  • -nouser:查詢沒有屬主的檔案
  • -nogroup:查詢沒有屬組的檔案

按照檔案大小查詢

按照檔案大小查詢功能十分常用,用 -size 選項,選項後邊指定大小 1024M,表示大小的格式有如下幾種:

  • -5M:查詢小於 5M 的檔案
  • +5M:查詢大於 5M 的檔案
  • 5M:查詢大小為 5M 的檔案

單位支援的有 c(位元組)kMG 等,需要注意的是預設單位並不是位元組,而是 b,大小為 512 位元組。

按照時間查詢

按照時間查詢的功能對系統管理員來說,十分常用,find 支援如下幾種時間型別:

  • atime:以訪問時間查詢
  • mtime:以資料修改時間查詢
  • ctime:以後設資料修改時間查詢
  • newer:以檔案為條件,判斷比它新的檔案

按時間查詢時,使用格式如下:

  • -atime -5:表示 5 天內訪問過的檔案;
  • -atime +5:表示 6 天前訪問過的檔案;
  • -atime 5:表示前 5-6 那一天訪問的檔案;

這個 +5 含義總是被人理解錯,誤認為是 5 天后修改的檔案,如果能知道未來 5 天的事情,小編早就去買彩票了!可能這麼說還不是很清楚,直接看圖吧!

find 不僅可以按 為單位來查詢檔案,可以按照 aminmmincmin 來查詢,區別只是 min 選項單位為分鐘。

按照許可權查詢

按許可權查詢是通過 -perm 選項,可以按照如下方式使用:

  • -perm 644:精確許可權查詢
  • -perm /666:任何一類使用者中的任何一位符合條件即滿足
  • -perm -222:每一類使用者的每一位同時符合條件即滿足

組合條件

find 可以使用多個條件的組合,支援 -a-o-not!,比較簡單,不再詳細描述其含義。

處理動作

find 根據各種條件查詢後,支援執行相關的處理動作,可以讓我們的更方便和靈活,而不只是列印出來。

  • -print:列印,預設動作,可省略
  • -ls:以 ls 長檔案格式輸出
  • -delete:刪除查詢到的檔案
  • -exec:查詢到的檔案傳遞給任何 Linux 命令
  • -ok:與 exec 功能相同,區別是需要使用者確認每次的操作

再囉嗦一下,find 命令支援的引數和選項比較多,文中只是總結出最常用、核心的引數選項。如果上述命令確實不滿足需求,可以請教你的男人 man find

這裡需要提一下,find 搜尋檔案時通過掃描磁碟來進行的,儘可能不要大範圍的搜尋檔案,尤其是在 / 目錄下搜尋,會長時間消耗伺服器的 cpu 資源。如果是生產環境的機器,執行前要考慮是否會對業務造成影響。

擴充套件 locate

雖然 find 功能非常強大,但要知道的是,find 執行過程是通過掃描磁碟檔案來進行查詢的,如果大範圍的查詢檔案,需要花費的時間很長,且消耗伺服器 cpu 資源。

這裡推薦另一個 Linux 檔案查詢神器 locate,類似於 win 平臺下的 everything。它基於索引表進行查詢,查詢速度非常快,基本不佔用 cpu 資源。

使用方法非常簡單

$ locate file.txt
$ locate /etc/httpd

需要注意,如果是當天新建立的檔案,通過 locate 預設是查不到的,因為它的資料庫預設是每天自動更新一次。如果希望查詢到當天建立的新檔案,需要執行 updatedb 即可。

查詢速度快是 locate 的優勢,但它的缺點也非常明顯:

  • 模糊查詢
  • 查詢匹配模式單一
  • 查詢的名稱匹配路徑命令
  • 索引表的建立會佔用磁碟空間
  • 非實時查詢,當天資料可能查不到

好了,到這裡關於 find 命令的全部內容已經結束,希望文中的案例和總結能夠幫助你更好的使用它。同時也強烈建議收藏本文,以作為 Linux 常用命令手冊。

好了,本次分享就到這裡了!謝謝大家,我是肖邦,歡迎關注後續的精彩內容。

推薦閱讀:

相關文章