Linux 文件搜索神器 find 實戰詳解,建議收藏!

你們好,我是肖邦,這是個人第 10 篇原創文章。node

在 Linux 系統使用中,做爲一個管理員,我但願能查找系統中全部的大小超過 200M 文件,查看近 7 天系統中哪些文件被修改過,找出全部子目錄中的可執行文件,這些任務需求 find 命令均可以輕鬆勝任。git

在 Linux 系統文件中經常使用的屬性能夠分爲如下內容:名稱、大小、權限、屬主、修改時間、訪問時間等,find 命令能夠按照指定的屬性爲條件進行查找。數據庫

廢話很少,直接開幹,下邊進入案例實戰。bash

案例實戰

(一)按文件名稱查找服務器

按照文件名稱查找是 find 最多見的用法,須要注意的是,搜索的文件名必須徹底匹配,才能找到對應的文件。app

1. 查找當前目錄下全部 go 文件負載均衡

$ find . -name "*.go"

2. 在 etc 目錄下,查找大寫字母開頭的 txt 文件ui

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

3. 在當前目錄下查找不是 out 開頭的 txt 文件spa

$ 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 經常使用命令手冊。

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

推薦閱讀:

相關文章
相關標籤/搜索