Linux 命令列:find 的 26 個用法示例

zybing發表於2021-09-09

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

圖片描述

small_find_command.jpg

在絕大多數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 {} ;

原文來自:



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/855/viewspace-2811241/,如需轉載,請註明出處,否則將追究法律責任。

相關文章