Linux系統(tǒng)中的 find 命令在查找文件時(shí)非常有用而且方便。它可以根據(jù)不同的條件來查找文件,例如權(quán)限垂涯、擁有者、修改日期/時(shí)間衣屏、文件大小等等。在這篇文章中辩棒,我們將學(xué)習(xí)如何使用 find 命令以及它所提供的選項(xiàng)來查找文件勾拉。
在絕大多數(shù)Linux發(fā)行版中,你都可以直接使用 find 命令而無需進(jìn)行任何安裝操作盗温。如果你想在linux系統(tǒng)的命令行中變得特別高效,那么 find 是你必須掌握的命令之一成肘。
find 命令的基本語法如下:
$ find [path] [option] [expression]
一卖局、基本用法
1.列出當(dāng)前目錄和子目錄下的所有文件
這個(gè)命令會列出當(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)大的方式丘逸。
如果我們嘗試搜索 / 文件夾单鹿,也就是根目錄,就會搜索整個(gè)文件系統(tǒng)深纲,包括掛載的設(shè)備以及網(wǎng)絡(luò)存儲設(shè)備仲锄。所以請小心使用。當(dāng)然湃鹊,你隨時(shí)可以通過按 Ctrl + C 來終止命令儒喊。
注意:當(dāng)指定文件夾的時(shí)候(例如示例中的"./test"文件夾),忽略末尾的斜杠是沒有問題的币呵。但是怀愧,如果文件夾是一個(gè)指向其它位置的鏈接(symlink)時(shí),你必須在末尾寫上斜杠才能使find命令正常工作(find ./test/)。
忽略大小寫
在查找文件名時(shí)芯义,忽略大小寫往往非常有用哈垢。要忽略大小寫,只需要使用 iname 選項(xiàng)毕贼,而不是 name 選項(xiàng)温赔。
$ find ./test -iname "*.Php"
./test/subdir/how.php
./test/cool.php
總是用雙引號或單引號來包圍匹配模式(文件名參數(shù)),這非常有用鬼癣。不這樣做的話有時(shí)也能正常工作陶贼,有時(shí)也可能會產(chǎn)生奇怪的結(jié)果。
3. 限制目錄查找的深度
find 命令默認(rèn)會遞歸查找整個(gè)目錄樹待秃,而這非常消耗時(shí)間和資源拜秧。好在目錄查找的深度可以手動指定。例如我們只想查找一到兩層以內(nèi)的子目錄章郁,可以通過 maxdepth 選項(xiàng)來指定枉氮。
$ find ./test -maxdepth 2 -name "*.php"
./test/subdir/how.php
./test/cool.php
$ find ./test -maxdepth 1 -name *.php
./test/cool.php
第二個(gè)示例中指定了 maxdepth 為1,表明最多只查找一層內(nèi)的子目錄暖庄,也就是只查找當(dāng)前文件夾聊替。
當(dāng)我們只想在當(dāng)前目錄下查找,而不是查找整個(gè)目錄樹的時(shí)候培廓,這個(gè)選項(xiàng)會特別有用惹悄。
與 maxdepth 選項(xiàng)相似,還有一個(gè)選項(xiàng)叫做 mindepth 肩钠,正如名字所表示的那樣泣港,它會至少到達(dá)第 N 層子目錄后才開始查找文件。
4. 反向查找
除了查找滿足條件的文件之外价匠,我們還可以查找不滿足條件的所有文件当纱。當(dāng)我們知道要在查找中排除哪些文件時(shí),這個(gè)選項(xiàng)就能發(fā)揮作用了踩窖。
$ find ./test -not -name "*.php"
./test
./test/abc.txt
./test/subdir
在上面的示例中我們找到了所有擴(kuò)展名不是 php 的文件和文件夾坡氯。我們也可以使用感嘆號 ! 來代替 -not。
find ./test ! -name "*.php"
5. 結(jié)合多個(gè)查找條件
我們可以同時(shí)使用多個(gè)查找條件來指定文件名并排除某些文件洋腮。
$ find ./test -name 'abc*' ! -name '*.php'
./test/abc.txt
./test/abc
上面的命令查找所有以 abc 開頭并且不含 .php 擴(kuò)展名的文件廉沮。這個(gè)示例展現(xiàn)了 find 命令自帶的查找表達(dá)式是多么的強(qiáng)大。
OR 操作符
當(dāng)我們使用多個(gè)查找條件時(shí)徐矩, find 命令會將它們通過 AND 操作符結(jié)合起來滞时,也就是說,只有滿足所有條件的文件才會被列出滤灯。不過坪稽,如果我們需要進(jìn)行基于 OR 運(yùn)算的查找時(shí)曼玩,可以加上 -o 開關(guān)。
$ find -name '*.php' -o -name '*.txt'
./abc.txt
./subdir/how.php
./abc.php
./cool.php
上面的命令查找所有以 .php 結(jié)尾或者以 .txt 結(jié)尾的文件窒百。
6. 只查找文件或目錄
有時(shí)我們只想通過某個(gè)名字查找對應(yīng)的文件或?qū)?yīng)的目錄黍判,我們可以很容易實(shí)現(xiàn)這個(gè)要求。
$ 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. 同時(shí)在多個(gè)目錄下查找
如果你想要在兩個(gè)不同的目錄內(nèi)進(jìn)行查找顷帖,命令非常簡單。
$ find ./test ./dir2 -type f -name "abc*"
./test/abc.txt
./dir2/abcdefg.txt
檢查一下渤滞,它確實(shí)列出了來自給定的兩個(gè)目錄的文件贬墩。
8. 查找隱藏文件
在Linux系統(tǒng)中,隱藏文件的名字以英文的句號開頭妄呕,即 . 陶舞。所以要列出隱藏文件,只需加上簡單的文件名過濾條件就行了绪励。
$ find ~ -type f -name ".*"
二肿孵、基于文件權(quán)限和屬性的查找
9. 查找指定權(quán)限的文件
通過指定 perm 選項(xiàng),我們可以查找具有特定權(quán)限的文件疏魏。下面的示例中查找了所有具有 664 權(quán)限的文件停做。
$ find . -type f -perm 664
./abc.txt
./subdir/how.php
./abc.php
./cool.php
我們可以用這個(gè)命令來查找?guī)в绣e(cuò)誤權(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
在指定所屬用戶的同時(shí)贯吓,我們同樣可以指定文件名懈凹。
$ find . -user bob -name '*.php'
很容易看出,我們可以通過增加過濾條件來縮小查找文件的范圍悄谐。
14. 查找屬于特定用戶組的文件
# find /var/www -group developer
四介评、基于日期和時(shí)間的查找
除了上面介紹的查找條件外,另外一個(gè)非常棒的查找條件就是文件的修改和訪問時(shí)間(日期)爬舰。當(dāng)我們想要找出哪些文件在某段時(shí)間內(nèi)被修改的時(shí)候们陆,這個(gè)查找條件將會非常方便。我們來看幾個(gè)例子情屹。
15. 查找過去的第 N 天被修改過的文件
# find / -mtime 50
16. 查找過去的 N 天內(nèi)被訪問過的文件
# find / -atime -50
17. 查找某段時(shí)間范圍內(nèi)被修改過內(nèi)容的文件
# find / -mtime +50 -mtime -100
18. 查找過去的 N 分鐘內(nèi)狀態(tài)發(fā)生改變的文件
$ find /home/bob -cmin -60
19. 查找過去的 1 小時(shí)內(nèi)被修改過內(nèi)容的文件
# find / -mmin -60
20. 查找過去的 1 小時(shí)內(nèi)被訪問過的文件
# find / -amin -60
五坪仇、基于文件大小的查找
21. 查找指定大小的文件
$ find / -size 50M
22. 查找大小在一定范圍內(nèi)的文件
$ find / -size +50M -size -100M
23. 查找最大和最小的文件
我們可以將 find 命令與 ls 和 sort命令結(jié)合,從而找出最大或最小的文件垃你。
下面的命令使用了 sort 命令的 -r 選項(xiàng)椅文,也就是從大到小降序排列喂很。經(jīng)過 head 命令的過濾之后,會顯示當(dāng)前目錄和子目錄下最大的5個(gè)文件皆刺。命令的執(zhí)行過程需要一段時(shí)間少辣,查找的速度取決于文件的總數(shù)。
$ find . -type f -exec ls -s {} \; | sort -n -r | head 5
同樣羡蛾,我們可以去掉 sort 命令的 -r 選項(xiàng)來進(jìn)行升序排列漓帅,從而顯示出最小的5個(gè)文件。
$ find . -type f -exec ls -s {} \; | sort -n | head 5
24. 查找空文件和空目錄
查找空文件:
# find /tmp -type f -empty
查找空目錄:
$ find ~/ -type d -empty
非常簡單痴怨!
六忙干、高級操作
find 命令不僅可以通過特定條件來查找文件,還可以對查找到的文件使用任意linux命令進(jìn)行操作腿箩。下面給出兩個(gè)例子豪直。
25. 使用 ls 命令列出文件信息
我們使用 find 命令找到文件后,只能看到文件路徑珠移。如果想進(jìn)一步查看文件信息弓乙,可以結(jié)合 ls 命令來實(shí)現(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去解釋,因?yàn)檫@個(gè)分號是給-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時(shí)的日期寫法
find可謂是aix/linux上使用較多的維護(hù)用命令懈玻,但很多時(shí)候需要用到針對時(shí)間的搜索。本文主要對find中搭配atime乾颁、ctime和mtime的各種參數(shù)進(jìn)行介紹涂乌。
atime:訪問時(shí)間(access time),指的是文件最后被讀取的時(shí)間英岭,可以使用touch命令更改為當(dāng)前時(shí)間湾盒;
ctime:變更時(shí)間(change time),指的是文件本身最后被變更的時(shí)間诅妹,變更動作可以使chmod罚勾、chgrp、mv等等吭狡;
mtime:修改時(shí)間(modify time)尖殃,指的是文件內(nèi)容最后被修改的時(shí)間,修改動作可以使echo重定向划煮、vi等等送丰;
以下例子應(yīng)該很容易理解上述三個(gè)時(shí)間:某用戶在2013年1月5日00:00:00時(shí),在/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壁畸。
這三個(gè)參數(shù)理解后贼急,我們就可以使用find找到某個(gè)時(shí)刻進(jìn)行過某類操作的文件集合。
find . {-atime/-ctime/-mtime/-amin/-cmin/-mmin} [-/+]num
第一個(gè)參數(shù)捏萍,.太抓,代表當(dāng)前目錄,如果是其他目錄令杈,可以輸入絕對目錄和相對目錄位置走敌;
第二個(gè)參數(shù)分兩部分,前面字母a逗噩、c掉丽、m分別代表訪問、變更异雁、修改捶障,后面time為日期,min為分鐘纲刀,注意只能以這兩個(gè)作為單位项炼;
第三個(gè)參數(shù)為量,其中不帶符號表示符合該數(shù)量的示绊,帶-表示符合該數(shù)量以后的锭部,帶+表示符合該數(shù)量以前的。
舉例
找出 3 天"以前"被改動過的文件 (前第三天以前 → 2011/09/05 12:00 以前的文件) (> 72 小時(shí))
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 小時(shí)內(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 小時(shí))
find /var/log/ -mtime 3 -type f -print
找出第 3 天被改動過的文件 (也可以這樣寫)
find /var/log/ -mtime +2 -mtime -4 -type f -print
touch命令修改文件時(shí)間
創(chuàng)建文件我們可以通過touch來創(chuàng)建面褐。同樣拌禾,我們也可以使用touch來修改文件時(shí)間。touch的相關(guān)參數(shù)如下:
-a : 僅修改access time盆耽。
-c : 僅修改時(shí)間,而不建立文件扼菠。
-d : 后面可以接日期摄杂,也可以使用 --date="日期或時(shí)間"
-m : 僅修改mtime。
-t : 后面可以接時(shí)間循榆,格式為 [YYMMDDhhmm]
注:如果touch后面接一個(gè)已經(jīng)存在的文件析恢,則該文件的3個(gè)時(shí)間(atime/ctime/mtime)都會更新為當(dāng)前時(shí)間。若該文件不存在秧饮,則會主動建立一個(gè)新的空文件
查看文件詳情
stat filename
補(bǔ)充 find -exec
find 是我們很常用的一個(gè)Linux命令映挂,但是我們一般查找出來的額并不僅僅是看看而已泽篮,還會有進(jìn)一步的操作,這個(gè)時(shí)候exec的作用就顯現(xiàn)出來了柑船。
exec解釋:
-exec 參數(shù)后面跟的是 command 命令帽撑,它的終止是以“;”為結(jié)束標(biāo)志的鞍时,所以這句命令后面的分號是不可缺少的亏拉,考慮到各個(gè)系統(tǒng)中分號會有不同的意義,所以前面加反斜杠逆巍。
{} 花括號代表前面find查找出來的文件名及塘。
使用find時(shí),只要把想要的操作寫在一個(gè)文件里锐极,就可以用exec來配合find 查找笙僚,很方便的。在有些操作系統(tǒng)中灵再,只允許 -exec 選項(xiàng)執(zhí)行諸如 ls 或 ls -l 這樣的命令肋层。大多數(shù)用戶使用著一些選項(xiàng)是為了查找舊文件并刪除它們。建議再真正執(zhí)行 rm 命令刪除文件之前檬嘀,最好先用 ls 命令看一下槽驶,確認(rèn)他們是所要?jiǎng)h除的文件。 exec 選項(xiàng)后面跟隨著所要執(zhí)行的命令或腳本鸳兽,然后是一對兒{}掂铐,一個(gè)空格和一個(gè)\,最后是一個(gè)分號揍异。為了使用 exec 選項(xiàng)全陨,必須要同時(shí)使用 print 選項(xiàng)。如果驗(yàn)證一下 find 命令衷掷,會發(fā)現(xiàn)該命令只輸出從當(dāng)前路徑起的相對路徑及文件名辱姨。
實(shí)例1:ls -l 命令放在 find 命令的 -exec 選項(xiàng)中
命令:
find . -type f -exec ls -l {} ; find 命令匹配到了當(dāng)前目錄下的所有普通文件,并在 -exec 選項(xiàng)中使用 ls -l 命令將它們列出戚嗅。
這個(gè)命令有點(diǎn)坑雨涛,不過確實(shí)很好用,說它坑是因?yàn)槲逸斎氲臅r(shí)候 收到提示:find 遺漏 -exec 的參數(shù)懦胞,^^
解決:1.注意 是一對兒{}替久,一個(gè)空格和一個(gè)\,最后是一個(gè)分號
2. 在 ; 使用 “;” ';' 這樣把它們引起來躏尉◎歉【“引起來”,感覺怪別扭的胀糜,不過想不出來怎么描述】
實(shí)例2:在目錄中查找更改時(shí)間在n 日以前的文件并刪除它們
命令:
find . -type f -mtime +14 -exec rm {} ; 在 shell 中用任何方式刪除文件之前颅拦,應(yīng)當(dāng)先查看相應(yīng)的文件蒂誉,一定要小心,當(dāng)使用諸如 mv 或 rm 命令時(shí),
可以使用-exec 選項(xiàng)的安全模式距帅,他將對每個(gè)匹配到的文件進(jìn)行操作之前提示你右锨。
實(shí)例3:在目錄中查找更改時(shí)間在n日以前的文件并刪除它們,在刪除之前先給出提示
命令:
find . -name "*.log" -mtime +5 -ok rm {} ; 查找當(dāng)前目錄中所有以 .log 結(jié)尾的锥债,更改時(shí)間在 5 日以上的文件陡蝇,并刪除它們,并且在刪除之前先給出提示哮肚。按y 鍵確定登夫,n 鍵 取消。
實(shí)例4: -exec 中使用 grep 命令
命令:
find /etc -name "passwd" -exec grep "root" {} ;
任何形式的命令都可以在 -exec 選項(xiàng)中使用允趟。 在上面的例子中我們使用 grep 命令恼策。find命令首先匹配所有文件名為“passwd”的文件,然后執(zhí)行 grep 命令查看這些文件中是否存在一個(gè) root 用戶。
實(shí)例5:查找文件并移動到指定目錄
命令:
find . -name "*.log" -exec mv {} .. ; .. 是路徑名
實(shí)例6:用exec選項(xiàng)執(zhí)行 cp 命令
命令:
find . -name "*.log" -exec cp {} test3 ; 一不小心又中招了潮剪,test3 是個(gè)目錄涣楷,不然cp 不進(jìn)去。