Linux運維必知必會的命令列:find 的 26 個用法示例!
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雲端計算行業發展前景等等。
地點:達內全國各中心校區,就近選擇。
講師:行業大咖,技術大牛面授課程。
免費報名方式:長按下方二維碼即可免費申請▼
*本次免費訓練營異常火爆,座位有限,各位童鞋抓緊時間,先報先得。
PS:記得查收小編送你的免費大禮包呦~
福利 | 一萬多套PPT模板等你免費來拿!無條件領取!
免費送 | 1000多套簡歷模板免費拿,附贈簡歷製作教程!
免費領 | 《Shell指令碼 100例》電子書免費拿,運維必備乾貨~
▼▼點選【閱讀原文】,5天運維免費課程,開講在即!
相關文章
- Linux 命令列:find 的 26 個用法示例Linux命令列
- IT運維技能必知必會!運維
- Linux 下 10 個最“危險”的命令,運維必知必防!Linux運維
- Linux 運維必備的 40 個命令總結Linux運維
- 運維必知必會的監控知識體系全梳理總結運維
- 程式猿必知必會Linux命令之awkLinux
- Linux必會必知Linux
- Linux 運維必備 150 個命令彙總Linux運維
- 入門運維必知必會的系統故障排查和修復技巧運維
- Linux shell必知必會Linux
- Linux 程式必知必會Linux
- 必知必會Java命令-jpsJava
- Redis的三個必知必會的問題Redis
- 【Linux入門】Linux運維必學的命令有哪些?Linux運維
- Linux命令技巧之30個必會的命令技巧Linux
- HTTP 必知必會的那些HTTP
- 必知必會的8個Python列表技巧Python
- Linux運維人員必會開源運維工具體系Linux運維
- 【必知必會的MySQL知識】①初探MySQLMySql
- 【必知必會的MySQL知識】②使用MySQLMySql
- MYSQL中的鎖必知必會MySql
- git必會必知Git
- Activity 必知必會
- Redis 必知必會Redis
- MySQL 必知必會MySql
- 【必知必會的MySQL知識】③DML語言MySql
- 【必知必會的MySQL知識】④DCL語言MySql
- 【必知必會的MySQL知識】⑤DQL語言MySql
- 關於 TCP/IP,必知必會的十個問題TCP
- 運維人員必須要了解熟知的Linux命令彙總運維Linux
- Java開發必會的Linux命令JavaLinux
- Linux運維必會的100道MySql面試題之(三)Linux運維MySql面試題
- Linux必學的60個命令Linux
- ThreadLocal必知必會thread
- JSON 必知必會JSON
- Megaraid 必知必會AI
- notion database 必知必會Database
- Linux網路命令必知必會之瑞士軍刀 nc(netcat)Linux