Linux系統(tǒng)中的 find 命令在查找文件時非常有用而且方便。它可以根據(jù)不同的條件來查找文件,例如權(quán)限、擁有者、修改日期/時間、文件大小等等。在這篇文章中,我們將學(xué)習(xí)如何使用 find 命令以及它所提供的選項來查找文件。
在絕大多數(shù)Linux發(fā)行版中,你都可以直接使用 find 命令而無需進(jìn)行任何安裝操作。如果你想在linux系統(tǒng)的命令行中變得特別高效,那么 find 是你必須掌握的命令之一。
find 命令的基本語法如下:
$ find [path] [option] [expression]
一、基本用法
1.列出當(dāng)前目錄和子目錄下的所有文件
這個命令會列出當(dāng)前目錄以及子目錄下的所有文件。
$ find
.
./abc.txt
./subdir
./subdir/how.php
./cool.php
該命令與以下命令效果相同
$ find .
$ find . -print
2. 查找特殊的目錄或路徑
下面的命令會查找當(dāng)前目錄下 test 文件夾中的文件,默認(rèn)列出所有文件。
$ 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
請注意,所有的文件夾都會被遞歸地查找。所以,這是用于查找指定擴(kuò)展名文件的一種非常強(qiáng)大的方式。
如果我們嘗試搜索 / 文件夾,也就是根目錄,就會搜索整個文件系統(tǒng),包括掛載的設(shè)備以及網(wǎng)絡(luò)存儲設(shè)備。所以請小心使用。當(dāng)然,你隨時可以通過按 Ctrl + C 來終止命令。
注意:當(dāng)指定文件夾的時候(例如示例中的"./test"文件夾),忽略末尾的斜杠是沒有問題的。但是,如果文件夾是一個指向其它位置的鏈接(symlink)時,你必須在末尾寫上斜杠才能使find命令正常工作(find ./test/)。
忽略大小寫
在查找文件名時,忽略大小寫往往非常有用。要忽略大小寫,只需要使用 iname 選項,而不是 name 選項。
$ find ./test -iname "*.Php"
./test/subdir/how.php
./test/cool.php
總是用雙引號或單引號來包圍匹配模式(文件名參數(shù)),這非常有用。不這樣做的話有時也能正常工作,有時也可能會產(chǎn)生奇怪的結(jié)果。
3. 限制目錄查找的深度
find 命令默認(rèn)會遞歸查找整個目錄樹,而這非常消耗時間和資源。好在目錄查找的深度可以手動指定。例如我們只想查找一到兩層以內(nèi)的子目錄,可以通過 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,表明最多只查找一層內(nèi)的子目錄,也就是只查找當(dāng)前文件夾。
當(dāng)我們只想在當(dāng)前目錄下查找,而不是查找整個目錄樹的時候,這個選項會特別有用。
與 maxdepth 選項相似,還有一個選項叫做 mindepth ,正如名字所表示的那樣,它會至少到達(dá)第 N 層子目錄后才開始查找文件。
4. 反向查找
除了查找滿足條件的文件之外,我們還可以查找不滿足條件的所有文件。當(dāng)我們知道要在查找中排除哪些文件時,這個選項就能發(fā)揮作用了。
$ find ./test -not -name "*.php"
./test
./test/abc.txt
./test/subdir
在上面的示例中我們找到了所有擴(kuò)展名不是 php 的文件和文件夾。我們也可以使用感嘆號 ! 來代替 -not。
find ./test ! -name "*.php"
5. 結(jié)合多個查找條件
我們可以同時使用多個查找條件來指定文件名并排除某些文件。
$ find ./test -name 'abc*' ! -name '*.php'
./test/abc.txt
./test/abc
上面的命令查找所有以 abc 開頭并且不含 .php 擴(kuò)展名的文件。這個示例展現(xiàn)了 find 命令自帶的查找表達(dá)式是多么的強(qiáng)大。
OR 操作符
當(dāng)我們使用多個查找條件時, find 命令會將它們通過 AND 操作符結(jié)合起來,也就是說,只有滿足所有條件的文件才會被列出。不過,如果我們需要進(jìn)行基于 OR 運(yùn)算的查找時,可以加上 -o 開關(guān)。
$ find -name '*.php' -o -name '*.txt'
./abc.txt
./subdir/how.php
./abc.php
./cool.php
上面的命令查找所有以 .php 結(jié)尾或者以 .txt 結(jié)尾的文件。
6. 只查找文件或目錄
有時我們只想通過某個名字查找對應(yīng)的文件或?qū)?yīng)的目錄,我們可以很容易實現(xiàn)這個要求。
$ 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. 同時在多個目錄下查找
如果你想要在兩個不同的目錄內(nèi)進(jìn)行查找,命令非常簡單。
$ find ./test ./dir2 -type f -name "abc*"
./test/abc.txt
./dir2/abcdefg.txt
檢查一下,它確實列出了來自給定的兩個目錄的文件。
8. 查找隱藏文件
在Linux系統(tǒng)中,隱藏文件的名字以英文的句號開頭,即 . 。所以要列出隱藏文件,只需加上簡單的文件名過濾條件就行了。
$ find ~ -type f -name ".*"
二、基于文件權(quán)限和屬性的查找
9. 查找指定權(quán)限的文件
通過指定 perm 選項,我們可以查找具有特定權(quán)限的文件。下面的示例中查找了所有具有 664 權(quán)限的文件。
$ find . -type f -perm 664
./abc.txt
./subdir/how.php
./abc.php
./cool.php
我們可以用這個命令來查找?guī)в绣e誤權(quán)限的文件,這些文件可能會產(chǎn)生安全問題。
可以結(jié)合 反向查找 來進(jìn)行權(quán)限檢查。
$ find . -type f ! -perm 777
./abc.txt
./subdir/how.php
./abc.php
./cool.php
11. 查找只讀文件
$ find /etc -maxdepth 1 -perm /u=r
/etc
/etc/thunderbird
/etc/brltty
/etc/dkms
/etc/phpmyadmin
... output truncated ...
12. 查找可執(zhí)行文件
$ find /bin -maxdepth 2 -perm /a=x
/bin
/bin/preseed_command
/bin/mount
/bin/zfgrep
/bin/tempfile
... output truncated ...
三、基于文件擁有者和用戶組的查找
13. 查找屬于特定用戶的文件
查找當(dāng)前目錄下,屬于 bob 的文件。
$ find . -user bob
.
./abc.txt
./abc
./subdir
./subdir/how.php
./abc.php
在指定所屬用戶的同時,我們同樣可以指定文件名。
$ find . -user bob -name '*.php'
很容易看出,我們可以通過增加過濾條件來縮小查找文件的范圍。
14. 查找屬于特定用戶組的文件
# find /var/www -group developer
四、基于日期和時間的查找
除了上面介紹的查找條件外,另外一個非常棒的查找條件就是文件的修改和訪問時間(日期)。當(dāng)我們想要找出哪些文件在某段時間內(nèi)被修改的時候,這個查找條件將會非常方便。我們來看幾個例子。
15. 查找過去的第 N 天被修改過的文件
# find / -mtime 50
16. 查找過去的 N 天內(nèi)被訪問過的文件
# find / -atime -50
17. 查找某段時間范圍內(nèi)被修改過內(nèi)容的文件
# find / -mtime +50 -mtime -100
18. 查找過去的 N 分鐘內(nèi)狀態(tài)發(fā)生改變的文件
$ find /home/bob -cmin -60
19. 查找過去的 1 小時內(nèi)被修改過內(nèi)容的文件
# find / -mmin -60
20. 查找過去的 1 小時內(nèi)被訪問過的文件
# find / -amin -60
五、基于文件大小的查找
21. 查找指定大小的文件
$ find / -size 50M
22. 查找大小在一定范圍內(nèi)的文件
$ find / -size +50M -size -100M
23. 查找最大和最小的文件
我們可以將 find 命令與 ls 和 sort命令結(jié)合,從而找出最大或最小的文件。
下面的命令使用了 sort 命令的 -r 選項,也就是從大到小降序排列。經(jīng)過 head 命令的過濾之后,會顯示當(dāng)前目錄和子目錄下最大的5個文件。命令的執(zhí)行過程需要一段時間,查找的速度取決于文件的總數(shù)。
$ find . -type f -exec ls -s {} \; | sort -n -r | head 5
同樣,我們可以去掉 sort 命令的 -r 選項來進(jìn)行升序排列,從而顯示出最小的5個文件。
$ find . -type f -exec ls -s {} \; | sort -n | head 5
24. 查找空文件和空目錄
查找空文件:
# find /tmp -type f -empty
查找空目錄:
$ find ~/ -type d -empty
非常簡單!
六、高級操作
find 命令不僅可以通過特定條件來查找文件,還可以對查找到的文件使用任意linux命令進(jìn)行操作。下面給出兩個例子。
25. 使用 ls 命令列出文件信息
我們使用 find 命令找到文件后,只能看到文件路徑。如果想進(jìn)一步查看文件信息,可以結(jié)合 ls 命令來實現(xiàn)。
$ 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
-exec是執(zhí)行的意思,{}是find的搜尋結(jié)果,;是轉(zhuǎn)義分號,不讓shell去解釋,因為這個分號是給-exec用的.
26. 刪除找到的文件
下面的命令會刪除 tmp 目錄下擴(kuò)展名為 .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 {} \;
原文來自:http://www.codebelief.com/article/2017/02/26-examples-of-find-command-on-linux/
補(bǔ)充Find命令搭配atime/ctime/mtime時的日期寫法
find可謂是aix/linux上使用較多的維護(hù)用命令,但很多時候需要用到針對時間的搜索。本文主要對find中搭配atime、ctime和mtime的各種參數(shù)進(jìn)行介紹。
atime:訪問時間(access time),指的是文件最后被讀取的時間,可以使用touch命令更改為當(dāng)前時間;
ctime:變更時間(change time),指的是文件本身最后被變更的時間,變更動作可以使chmod、chgrp、mv等等;
mtime:修改時間(modify time),指的是文件內(nèi)容最后被修改的時間,修改動作可以使echo重定向、vi等等;
以下例子應(yīng)該很容易理解上述三個時間:某用戶在2013年1月5日00:00:00時,在/home下輸入ping www.baidu.com > ping.log;5秒鐘后,該用戶使用ctrl+C強(qiáng)制關(guān)閉該命令;5秒鐘后,使用cat ping.log查看。則ping.log的ctime為2013-01-05 00:00:00;mtime為2013-01-05 00:00:05;atime為2013-01-05 00:00:10。
這三個參數(shù)理解后,我們就可以使用find找到某個時刻進(jìn)行過某類操作的文件集合。
find . {-atime/-ctime/-mtime/-amin/-cmin/-mmin} [-/+]num
第一個參數(shù),.,代表當(dāng)前目錄,如果是其他目錄,可以輸入絕對目錄和相對目錄位置;
第二個參數(shù)分兩部分,前面字母a、c、m分別代表訪問、變更、修改,后面time為日期,min為分鐘,注意只能以這兩個作為單位;
第三個參數(shù)為量,其中不帶符號表示符合該數(shù)量的,帶-表示符合該數(shù)量以后的,帶+表示符合該數(shù)量以前的。
舉例
找出 3 天"以前"被改動過的文件 (前第三天以前 → 2011/09/05 12:00 以前的文件) (> 72 小時)
find /var/log/ -mtime +3 -type f -print
找出 3 天內(nèi)被改動過的文件 (2011/09/05 12:00 ~ 2011/09/08 12:00 內(nèi)的文件) (0 ~ 72 小時內(nèi))
find /var/log/ -mtime -3 -type f -print
找出前第 3 天被改動過的文件 (2011/09/04 12:00 ~ 2011/09/05 12:00 內(nèi)的文件) (72 ~ 96 小時)
find /var/log/ -mtime 3 -type f -print
找出第 3 天被改動過的文件 (也可以這樣寫)
find /var/log/ -mtime +2 -mtime -4 -type f -print
touch命令修改文件時間
創(chuàng)建文件我們可以通過touch來創(chuàng)建。同樣,我們也可以使用touch來修改文件時間。touch的相關(guān)參數(shù)如下:
-a : 僅修改access time。
-c : 僅修改時間,而不建立文件。
-d : 后面可以接日期,也可以使用 --date="日期或時間"
-m : 僅修改mtime。
-t : 后面可以接時間,格式為 [YYMMDDhhmm]
注:如果touch后面接一個已經(jīng)存在的文件,則該文件的3個時間(atime/ctime/mtime)都會更新為當(dāng)前時間。若該文件不存在,則會主動建立一個新的空文件
查看文件詳情
stat filename
補(bǔ)充 find -exec
find 是我們很常用的一個Linux命令,但是我們一般查找出來的額并不僅僅是看看而已,還會有進(jìn)一步的操作,這個時候exec的作用就顯現(xiàn)出來了。
exec解釋:
-exec 參數(shù)后面跟的是 command 命令,它的終止是以“;”為結(jié)束標(biāo)志的,所以這句命令后面的分號是不可缺少的,考慮到各個系統(tǒng)中分號會有不同的意義,所以前面加反斜杠。
{} 花括號代表前面find查找出來的文件名。
使用find時,只要把想要的操作寫在一個文件里,就可以用exec來配合find 查找,很方便的。在有些操作系統(tǒng)中,只允許 -exec 選項執(zhí)行諸如 ls 或 ls -l 這樣的命令。大多數(shù)用戶使用著一些選項是為了查找舊文件并刪除它們。建議再真正執(zhí)行 rm 命令刪除文件之前,最好先用 ls 命令看一下,確認(rèn)他們是所要刪除的文件。 exec 選項后面跟隨著所要執(zhí)行的命令或腳本,然后是一對兒{},一個空格和一個\,最后是一個分號。為了使用 exec 選項,必須要同時使用 print 選項。如果驗證一下 find 命令,會發(fā)現(xiàn)該命令只輸出從當(dāng)前路徑起的相對路徑及文件名。
實例1:ls -l 命令放在 find 命令的 -exec 選項中
命令:
find . -type f -exec ls -l {} ; find 命令匹配到了當(dāng)前目錄下的所有普通文件,并在 -exec 選項中使用 ls -l 命令將它們列出。
這個命令有點坑,不過確實很好用,說它坑是因為我輸入的時候 收到提示:find 遺漏 -exec 的參數(shù),^^
解決:1.注意 是一對兒{},一個空格和一個\,最后是一個分號
2. 在 ; 使用 “;” ';' 這樣把它們引起來?!尽耙饋怼保杏X怪別扭的,不過想不出來怎么描述】
實例2:在目錄中查找更改時間在n 日以前的文件并刪除它們
命令:
find . -type f -mtime +14 -exec rm {} ; 在 shell 中用任何方式刪除文件之前,應(yīng)當(dāng)先查看相應(yīng)的文件,一定要小心,當(dāng)使用諸如 mv 或 rm 命令時,
可以使用-exec 選項的安全模式,他將對每個匹配到的文件進(jìn)行操作之前提示你。
實例3:在目錄中查找更改時間在n日以前的文件并刪除它們,在刪除之前先給出提示
命令:
find . -name "*.log" -mtime +5 -ok rm {} ; 查找當(dāng)前目錄中所有以 .log 結(jié)尾的,更改時間在 5 日以上的文件,并刪除它們,并且在刪除之前先給出提示。按y 鍵確定,n 鍵 取消。
實例4: -exec 中使用 grep 命令
命令:
find /etc -name "passwd" -exec grep "root" {} ;
任何形式的命令都可以在 -exec 選項中使用。 在上面的例子中我們使用 grep 命令。find命令首先匹配所有文件名為“passwd”的文件,然后執(zhí)行 grep 命令查看這些文件中是否存在一個 root 用戶。
實例5:查找文件并移動到指定目錄
命令:
find . -name "*.log" -exec mv {} .. ; .. 是路徑名
實例6:用exec選項執(zhí)行 cp 命令
命令:
find . -name "*.log" -exec cp {} test3 ; 一不小心又中招了,test3 是個目錄,不然cp 不進(jìn)去。