Linux運維必知必會的命令列:find 的 26 個用法示例!

Linux雲端計算資料自學發表於2018-12-21

640?




Linux系統中的 find 命令在查詢檔案時非常有用而且方便。它可以根據不同的條件來查詢檔案,例如許可權、擁有者、修改日期/時間、檔案大小等等。在這篇文章中,我們將學習如何使用 find 命令以及它所提供的選項來查詢檔案。


在絕大多數Linux發行版中,你都可以直接使用 find 命令而無需進行任何安裝操作。如果你想在linux系統的命令列中變得特別高效,那麼 find 是你必須掌握的命令之一。


find 命令的基本語法如下:

$ find [path] [option] [expression]


基本用法


1、列出當前目錄和子目錄下的所有檔案

$ find

.

./abc.txt

./subdir

./subdir/how.php

./cool.php


這個命令會列出當前目錄以及子目錄下的所有檔案。


該命令與以下命令效果相同

$ find .

$ find . -print


2、查詢特殊的目錄或路徑

下面的命令會查詢當前目錄下 test 資料夾中的檔案,預設列出所有檔案。

$ find ./test

./test

./test/abc.txt

./test/subdir

./test/subdir/how.php

./test/cool.php


下面的命令用於查詢指定名稱的檔案。

$ find ./test -name "abc.txt"

./test/abc.txt


也可以使用萬用字元

$ find ./test -name "*.php"

./test/subdir/how.php

./test/cool.php


請注意,所有的資料夾都會被遞迴地查詢。所以,這是用於查詢指定副檔名檔案的一種非常強大的方式。


如果我們嘗試搜尋 / 資料夾,也就是根目錄,就會搜尋整個檔案系統,包括掛載的裝置以及網路儲存裝置。所以請小心使用。當然,你隨時可以通過按 Ctrl + C 來終止命令。


注意:當指定資料夾的時候(例如示例中的"./test"資料夾),忽略末尾的斜槓是沒有問題的。但是,如果資料夾是一個指向其它位置的連結(symlink)時,你必須在末尾寫上斜槓才能使find命令正常工作(find ./test/)。


忽略大小寫


在查詢檔名時,忽略大小寫往往非常有用。要忽略大小寫,只需要使用 iname 選項,而不是 name 選項。

$ find ./test -iname "*.Php"

./test/subdir/how.php

./test/cool.php


總是用雙引號或單引號來包圍匹配模式(檔名引數),這非常有用。不這樣做的話有時也能正常工作,有時也可能會產生奇怪的結果。


3. 限制目錄查詢的深度

find 命令預設會遞迴查詢整個目錄樹,而這非常消耗時間和資源。好在目錄查詢的深度可以手動指定。例如我們只想查詢一到兩層以內的子目錄,可以通過 maxdepth 選項來指定。

$ find ./test -maxdepth 2 -name "*.php"

./test/subdir/how.php

./test/cool.php


$ find ./test -maxdepth 1 -name *.php

./test/cool.php


第二個示例中指定了 maxdepth 為1,表明最多隻查詢一層內的子目錄,也就是隻查詢當前資料夾。


當我們只想在當前目錄下查詢,而不是查詢整個目錄樹的時候,這個選項會特別有用。


與 maxdepth 選項相似,還有一個選項叫做 mindepth ,正如名字所表示的那樣,它會至少到達第 N 層子目錄後才開始查詢檔案。


4. 反向查詢

除了查詢滿足條件的檔案之外,我們還可以查詢不滿足條件的所有檔案。當我們知道要在查詢中排除哪些檔案時,這個選項就能發揮作用了。

$ find ./test -not -name "*.php"

./test

./test/abc.txt

./test/subdir


在上面的示例中我們找到了所有副檔名不是 php 的檔案和資料夾。我們也可以使用感嘆號 ! 來代替 -not。

find ./test ! -name "*.php"


5. 結合多個查詢條件

我們可以同時使用多個查詢條件來指定檔名並排除某些檔案。

$ find ./test -name 'abc*' ! -name '*.php'

./test/abc.txt

./test/abc


上面的命令查詢所有以 abc 開頭並且不含 .php 副檔名的檔案。這個示例展現了 find 命令自帶的查詢表示式是多麼的強大。


OR 操作符


當我們使用多個查詢條件時, find 命令會將它們通過 AND 操作符結合起來,也就是說,只有滿足所有條件的檔案才會被列出。不過,如果我們需要進行基於 OR 運算的查詢時,可以加上 -o 開關。

$ find -name '*.php' -o -name '*.txt'

./abc.txt

./subdir/how.php

./abc.php

./cool.php


上面的命令查詢所有以 .php 結尾或者以 .txt 結尾的檔案。


6. 只查詢檔案或目錄

有時我們只想通過某個名字查詢對應的檔案或對應的目錄,我們可以很容易實現這個要求。

$ find ./test -name abc*

./test/abc.txt

./test/abc


只查詢檔案


$ find ./test -type f -name "abc*"

./test/abc.txt


只查詢目錄


$ find ./test -type d -name "abc*"

./test/abc


非常有用而且方便!


7. 同時在多個目錄下查詢

如果你想要在兩個不同的目錄內進行查詢,命令非常簡單。

$ find ./test ./dir2 -type f -name "abc*"

./test/abc.txt

./dir2/abcdefg.txt


檢查一下,它確實列出了來自給定的兩個目錄的檔案。


8. 查詢隱藏檔案

在Linux系統中,隱藏檔案的名字以英文的句號開頭,即 . 。所以要列出隱藏檔案,只需加上簡單的檔名過濾條件就行了。

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


基於檔案許可權和屬性的查詢

9. 查詢指定許可權的檔案

通過指定 perm 選項,我們可以查詢具有特定許可權的檔案。下面的示例中查詢了所有具有 0664 許可權的檔案。

$ find . -type f -perm 0664

./abc.txt

./subdir/how.php

./abc.php

./cool.php


我們可以用這個命令來查詢帶有錯誤許可權的檔案,這些檔案可能會產生安全問題。


可以結合 反向查詢 來進行許可權檢查。

$ find . -type f ! -perm 0777

./abc.txt

./subdir/how.php

./abc.php

./cool.php


10. 查詢具有 SGID/SUID 屬性的檔案

下面的命令查詢所有具有 644 許可權和 SGID 屬性的檔案。

# find / -perm 2644


我們同樣可以使用 1664 來查詢設定了 粘滯位 (sticky bit)的檔案。

# find / -perm 1644


perm 選項除了接受數值型引數外,同樣接受 chmod 命令中的模式串。在下面的查詢中,我們用另一種語法來代替數字。

$ find / -maxdepth 2 -perm /u=s 2>/dev/null

/bin/mount

/bin/su

/bin/ping6

/bin/fusermount

/bin/ping

/bin/umount

/sbin/mount.ecryptfs_private


注意:由於許可權不足,某些目錄會拒接訪問。命令中的 2>/dev/null 正是用於清除輸出中的錯誤訪問結果。


11. 查詢只讀檔案

$ find /etc -maxdepth 1 -perm /u=r

/etc

/etc/thunderbird

/etc/brltty

/etc/dkms

/etc/phpmyadmin

... output truncated ...


12. 查詢可執行檔案

$ find /bin -maxdepth 2 -perm /a=x

/bin

/bin/preseed_command

/bin/mount

/bin/zfgrep

/bin/tempfile

... output truncated ...


基於檔案擁有者和使用者組的查詢


13. 查詢屬於特定使用者的檔案

查詢當前目錄下,屬於 bob 的檔案。

$ find . -user bob

.

./abc.txt

./abc

./subdir

./subdir/how.php

./abc.php


在指定所屬使用者的同時,我們同樣可以指定檔名。

$ find . -user bob -name '*.php'


很容易看出,我們可以通過增加過濾條件來縮小查詢檔案的範圍。


14. 查詢屬於特定使用者組的檔案

# find /var/www -group developer


基於日期和時間的查詢


除了上面介紹的查詢條件外,另外一個非常棒的查詢條件就是檔案的修改和訪問時間(日期)。當我們想要找出哪些檔案在某段時間內被修改的時候,這個查詢條件將會非常方便。我們來看幾個例子。


15. 查詢過去的第 N 天被修改過的檔案

# find / -mtime 50


16. 查詢過去的 N 天內被訪問過的檔案

# find / -atime -50


17. 查詢某段時間範圍內被修改過內容的檔案

# find / -mtime +50 -mtime -100


18. 查詢過去的 N 分鐘內狀態發生改變的檔案

$ find /home/bob -cmin -60


19. 查詢過去的 1 小時內被修改過內容的檔案

# find / -mmin -60


20. 查詢過去的 1 小時內被訪問過的檔案

# find / -amin -60


基於檔案大小的查詢

21. 查詢指定大小的檔案

$ find / -size 50M


22. 查詢大小在一定範圍內的檔案

$ find / -size +50M -size -100M


23. 查詢最大和最小的檔案

我們可以將 find 命令與 ls 和 sort命令結合,從而找出最大或最小的檔案。


下面的命令使用了 sort 命令的 -r 選項,也就是從大到小降序排列。經過 head 命令的過濾之後,會顯示當前目錄和子目錄下最大的5個檔案。命令的執行過程需要一段時間,查詢的速度取決於檔案的總數。

$ find . -type f -exec ls -s {} \; | sort -n -r | head 5


同樣,我們可以去掉 sort 命令的 -r 選項來進行升序排列,從而顯示出最小的5個檔案。

$ find . -type f -exec ls -s {} \; | sort -n | head 5


24. 查詢空檔案和空目錄

查詢空檔案:

# find /tmp -type f -empty


查詢空目錄:

$ find ~/ -type d -empty


非常簡單!


高階操作


find 命令不僅可以通過特定條件來查詢檔案,還可以對查詢到的檔案使用任意linux命令進行操作。下面給出兩個例子。


25. 使用 ls 命令列出檔案資訊

我們使用 find 命令找到檔案後,只能看到檔案路徑。如果想進一步檢視檔案資訊,可以結合 ls 命令來實現。

$ find . -exec ls -ld {} \;

drwxrwxr-x 4 enlightened enlightened 4096 Aug 11 19:01 .

-rw-rw-r-- 1 enlightened enlightened 0 Aug 11 16:25 ./abc.txt

drwxrwxr-x 2 enlightened enlightened 4096 Aug 11 16:48 ./abc

drwxrwxr-x 2 enlightened enlightened 4096 Aug 11 16:26 ./subdir

-rw-rw-r-- 1 enlightened enlightened 0 Aug 11 16:26 ./subdir/how.php

-rw-rw-r-- 1 enlightened enlightened 29 Aug 11 19:13 ./abc.php

-rw-rw-r-- 1 enlightened enlightened 0 Aug 11 16:25 ./cool.php


26. 刪除找到的檔案

下面的命令會刪除 tmp 目錄下副檔名為 .txt 的檔案。

$ find /tmp -type f -name "*.txt" -exec rm -f {} \;


我們同樣可以刪除目錄,只要把 -type 後面的 f 改為 d ,並且在 rm 命令後面加上 -r 即可。

$ find /tmp -type d -name "dirToRemove" -exec rm -r -f {} \;

英文原文:25+ simple example of Linux find command

譯文:http://www.codebelief.com/article/2017/02/26-examples-of-find-command-on-linux/

譯者:Wray Zheng


12月雲端計算免費課程火爆來襲,免費深入瞭解雲端計算技術,揭祕運維行業發展,與技術大牛面對面交流,幫你尋找屬於你的努力方向,抓住2018年最後一次免費學習的機會,逆襲2019~~

12月雲端計算免費訓練營

時間

12月21日 - 12月27日 (為期5天,22/23日休息)

課程內容

  • 什麼是Linux、雲端計算、虛擬化;

  • KVM虛擬化實戰;

  • Linux作業系統由來;

  • 企業級Linux伺服器安裝方案;

  • 破解Linux系統密碼;

  • Linux命令列格式;

  • Linux下目錄和檔案管理;

  • FTP伺服器演示;

  • Web伺服器演示;

  • DNS伺服器演示;

  • 初識網路工程;

  • Linux雲端計算行業發展前景等等。

地點達內全國各中心校區,就近選擇。

講師:行業大咖,技術大牛面授課程。

免費報名方式長按下方二維碼即可免費申請

640?wx_fmt=png

*本次免費訓練營異常火爆,座位有限,各位童鞋抓緊時間,先報先得。


PS:記得查收小編送你的免費大禮包呦~

福利 | 一萬多套PPT模板等你免費來拿!無條件領取!

免費送 | 1000多套簡歷模板免費拿,附贈簡歷製作教程!

免費領 | 《Shell指令碼 100例》電子書免費拿,運維必備乾貨~

640?640

▼▼點選【閱讀原文】,5天運維免費課程,開講在即!

相關文章