Linux系統(tǒng)中的 find 命令在查找文件時非常有用而且方便饵隙。它可以根據(jù)不同的條件來查找文件俱饿,例如權(quán)限歌粥、擁有者、修改日期/時間拍埠、文件大小等等失驶。在這篇文章中,我們將學(xué)習(xí)如何使用 find 命令以及它所提供的選項來查找文件枣购。
在絕大多數(shù)Linux發(fā)行版中嬉探,你都可以直接使用 find 命令而無需進行任何安裝操作擦耀。如果你想在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
請注意白魂,所有的文件夾都會被遞歸地查找汽纤。所以,這是用于查找指定擴展名文件的一種非常強大的方式碧聪。
如果我們嘗試搜索 / 文件夾冒版,也就是根目錄,就會搜索整個文件系統(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 聪姿,正如名字所表示的那樣,它會至少到達第 N 層子目錄后才開始查找文件乙嘀。
4. 反向查找
除了查找滿足條件的文件之外末购,我們還可以查找不滿足條件的所有文件。當(dāng)我們知道要在查找中排除哪些文件時虎谢,這個選項就能發(fā)揮作用了盟榴。
$ find ./test -not -name "*.php"
./test
./test/abc.txt
./test/subdir
在上面的示例中我們找到了所有擴展名不是 php 的文件和文件夾。我們也可以使用感嘆號 ! 來代替 -not婴噩。
find ./test ! -name "*.php"
5. 結(jié)合多個查找條件
我們可以同時使用多個查找條件來指定文件名并排除某些文件擎场。
$ find ./test -name 'abc*' ! -name '*.php'
./test/abc.txt
./test/abc
上面的命令查找所有以 abc 開頭并且不含 .php 擴展名的文件。這個示例展現(xiàn)了 find 命令自帶的查找表達式是多么的強大几莽。
OR 操作符
當(dāng)我們使用多個查找條件時迅办, find 命令會將它們通過 AND 操作符結(jié)合起來,也就是說章蚣,只有滿足所有條件的文件才會被列出站欺。不過,如果我們需要進行基于 OR 運算的查找時纤垂,可以加上 -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)進行查找熙侍,命令非常簡單榄鉴。
$ 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é)合 反向查找 來進行權(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 選項來進行升序排列尤泽,從而顯示出最小的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 命令找到文件后横殴,只能看到文件路徑。如果想進一步查看文件信息卿拴,可以結(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 目錄下擴展名為 .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/
補充Find命令搭配atime/ctime/mtime時的日期寫法
find可謂是aix/linux上使用較多的維護用命令,但很多時候需要用到針對時間的搜索杠袱。本文主要對find中搭配atime尚猿、ctime和mtime的各種參數(shù)進行介紹。
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強制關(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找到某個時刻進行過某類操作的文件集合。
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
補充 find -exec
find 是我們很常用的一個Linux命令番电,但是我們一般查找出來的額并不僅僅是看看而已,還會有進一步的操作担汤,這個時候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. 在 ; 使用 “;” ';' 這樣把它們引起來埠对〔锰妫【“引起來”,感覺怪別扭的襟沮,不過想不出來怎么描述】
實例2:在目錄中查找更改時間在n 日以前的文件并刪除它們
命令:
find . -type f -mtime +14 -exec rm {} ; 在 shell 中用任何方式刪除文件之前昌腰,應(yīng)當(dāng)先查看相應(yīng)的文件,一定要小心,當(dāng)使用諸如 mv 或 rm 命令時遭商,
可以使用-exec 選項的安全模式,他將對每個匹配到的文件進行操作之前提示你劫流。
實例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 不進去疙剑。