Linux 命令列:find 的 26 個用法示例
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux運維必知必會的命令列:find 的 26 個用法示例!Linux運維命令列
- Linux find常見用法示例Linux
- Linux中find常見用法示例Linux
- Linux下find命令的用法(轉)Linux
- 爹地,我找到了!15個極好的Linux find命令示例Linux
- 爹地 我找到了! 15個極好的Linux find命令示例Linux
- find 命令及其示例
- Linux - find命令常用引數與示例Linux
- 媽咪,我找到了!15個實用的Linux find命令示例Linux
- 媽咪 我找到了! 15個實用的Linux find命令示例Linux
- linux中查詢find命令的複雜用法Linux
- Linux中find命令-path -prune用法詳解Linux
- linux crontab 命令詳細用法及示例Linux
- linux下find(檔案查詢)命令的用法總結Linux
- 陣列使用find查詢用法陣列
- linux find命令Linux
- linux find 命令Linux
- linux find 命令!Linux
- 每天一個linux命令:find命令之xargsLinux
- 10 個 Linux 中的 passwd 命令示例Linux
- Linux命令列:cURL的十種常見用法Linux命令列
- 每天一個linux命令(1):find命令之execLinux
- 每天一個 Linux 命令(19):find 命令概覽Linux
- 每天一個 Linux 命令(20):find命令之execLinux
- 每天一個 Linux 命令(21):find命令之xargsLinux
- find命令的exec選項用法詳解(轉)
- linux/unix find命令Linux
- Linux中的15個基本‘ls’命令示例Linux
- 每天一個 Linux 命令(22):find 命令的引數詳解Linux
- Linux 新手應該知道的 26 個命令Linux
- C++查詢一個數是否在陣列中find用法C++陣列
- linux中file命令和find命令Linux
- Linux find 命令詳解Linux
- Linux find命令詳解Linux
- Linux精講——find命令Linux
- 在 Linux 下 9 個有用的 touch 命令示例Linux
- 命令列中常見命令用法及explainshell.com的用法命令列AI
- 20個有用的linux命令列技巧Linux命令列