Linux 文件搜索神器 find 實戰詳解,建議收藏!
大家好,我是肖邦,這是我的第 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(位元組)
、k
、M
、G
等,需要注意的是默認單位並不是位元組,而是 b
,大小為 512 位元組。
按照時間查找
按照時間查找的功能對系統管理員來說,十分常用,find 支援如下幾種時間類型:
atime
:以訪問時間查找mtime
:以數據修改時間查找ctime
:以元數據修改時間查找newer
:以文件為條件,判斷比它新的文件
按時間查找時,使用格式如下:
-atime -5
:表示 5 天內訪問過的文件;-atime +5
:表示 6 天前訪問過的文件;-atime 5
:表示前 5-6 那一天訪問的文件;
這個 +5
含義總是被人理解錯,誤認為是 5 天后修改的文件,如果能知道未來 5 天的事情,小編早就去買彩票了!可能這麼說還不是很清楚,直接看圖吧!

find 不僅可以按 天
為單位來查找文件,可以按照 amin
、mmin
、cmin
來查找,區別只是 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 常用命令手冊。
好了,本次分享就到這裡了!謝謝大家,我是肖邦,歡迎關注後續的精彩內容。
推薦閱讀:
