Linux常用命令詳解 | find

Linux 上的 find 命令是 findutil 軟件包的一部分甸私,一般已經默認集成在了幾乎所有的發(fā)行版中荐虐。
find 命令有非常大的靈活性渠鸽,可以向其指定豐富的搜索條件(如文件權限欲芹、屬主降瞳、屬組衙传、文件類型决帖、日期大小等)來定位系統中的文件和目錄。
此外蓖捶,find 還支持對搜索到的結果進行多種類型的命令操作地回。

一、簡介

find 命令的基本結構如下:

find [paths] [expression] [actions]

find   path  -option  【 -print 】  【 -exec   -ok   |xargs  |grep  】 【  command  {} \;  】
  • paths:find 命令接受一個或多個路徑作為搜索范圍俊鱼,并在該路徑下\color{red}{遞歸}地搜索刻像。即檢索完指定的目錄后,還會對該目錄下的子目錄進行檢索并闲,以及子目錄下的子目錄细睡。。焙蚓。直到到達目錄樹底部纹冤。
  • expression:默認情況下(不帶任何搜索條件),find 命令會返回指定目錄下的所有文件购公,所以常常需要通過特定的 expression 對結果進行篩選萌京。
  • action:find 命令默認的 action 是將所有檢索結果打印至標準輸出『旰疲可以通過自定義 action 知残,讓 find 命令對搜索到的結果執(zhí)行特定的操作。

常用參數匯總

參數 解析
-print 表示將結果輸出到標準輸出
-ok 與exec作用相同比庄,區(qū)別在于求妹,在執(zhí)行命令之前乏盐,都會給出提示,讓用戶確認是否執(zhí)行
-atime n[smhdw] 距離文件上次被訪問時的時間間隔
-ctime n[smhdw] 距離文件創(chuàng)建時的時間間隔
-delete 刪除檢索到的文件
-depth n 檢索深度為 n 的文件制恍,即位于指定目錄以下 n 層的文件
-empty 檢索空文件或空目錄
-fstype type 指定文件所在的文件系統的類型
-group gname 指定文件的屬組
-iname pattern -name父能,忽略大小寫
-ipath pattern -path,忽略大小寫
-ls 打印搜索到的文件的詳細信息
-maxdepth n 指定遞歸的最大層數為 n
-mtime n[smhdw] 距離文件上次發(fā)生變更時的時間間隔
-name pattern 搜索時使用 pattern 對文件名進行匹配
-path pattern 搜索時使用 pattern 對文件路徑進行匹配
-prune 忽略某個目錄
-perm mode 根據文件權限搜索
-size n[ckMGTP] 根據文件大小搜索
-type t 根據文件類型搜索
-user uname 指定文件的屬主

find 命令手冊man find

二净神、搜索條件(expression)

1. 根據 文件名/目錄 檢索

1.1 文件名

find 命令中的 -name 選項可以根據文件名稱進行檢索(區(qū)分大小寫)何吝。如需要忽略文件名中的大小寫,可以使用 -iname 選項鹃唯。

-name-iname 兩個選項都支持 wildcards 爱榕。如:

  • ? 可以表示任意一個單一的符號
  • * 可以表示任意數量(包括 0)的未知符號

例1:查找 /usr 目錄下所有文件名以 .txt 結尾的文件

find /usr -name '*.txt'

例2:查找 /usr 目錄下所有文件名剛好為 4 個字符的文件

find /usr -name '????'

例3:查以大寫字母開頭的文件

find   .    -name   "^[A-Z]*"   -print   

例4:查以兩個小寫字母和兩個數字開頭的txt文件

find   .   -name   "[a-z][a-z][0–9][0–9].txt"    -print   

類似的還有:
-lname -ilname
-path -ipath
-regx -iregx

1.2 路徑

有些時候,你需要在搜索時匹配某個文件或目錄的完整路徑坡慌,而不僅僅是匹配文件名黔酥。可以使用 -path-ipath 選項洪橘。

例1:如查找 /usr 下所有文件名以 .txt 結尾的文件或目錄跪者,且該文件的父目錄必須是 src∠ㄇ螅可以使用以下命令:

find /usr -path '*/src/*.txt'

例2:在當前目錄除aa之外的子目錄內搜索 txt文件

find . -path "./aa" -prune -o -name "*.txt" -print   
find . ! -path "./aa" -name "*.txt" -print   

例3:在當前目錄坑夯,不再子目錄中,查找txt文件

find . ! -name "." -type d -prune -o -type f -name "*.txt" -print 

2. 根據文件類型檢索

如果只想搜索得到文件目錄抡四,即不想它們同時出現在結果中≌套唬可以使用 -type 選項指定文件類型指巡。

-type 選項最常用的參數如下:

  • f: 文件
  • d: 目錄
  • l: 符號鏈接

例:檢索 /usr 下所有文件名以 python 開頭的目錄

find /usr -type d -name 'python*'

在/mnt下查找名稱為tom.txt且文件系統類型為vfat的文件
find   /mnt   -name tom.txt   -ftype vfat  

在/mnt下查找名稱為tom.txt且文件系統類型不為vfat的文件
find   /mnt   -name t.txt ! -ftype vfat   

3. 檢索空文件

find 命令支持 -empty 選項用來檢索為空的文件或目錄×タ澹空文件即文件里沒有任何內容藻雪,空目錄即目錄中沒有任何文件或子目錄。

例:檢索用戶主目錄下所有的空目錄

find ~ -type d -empty

4. 反義匹配 狸吞!

find 命令也允許用戶對當前的匹配條件進行“反義”(類似于邏輯非操作)勉耀。

如需要檢索 /usr 下所有文件名.txt 為后綴的文件√F可以使用以下命令:

find /usr -type f ! -name '*.txt'

也可以“翻轉”任何其他的篩選條件便斥,如:檢索 /usr 下所有內容不為空的文件

find /usr -type f ! -empty

5. 根據文件的所屬權檢索

為了檢索歸屬于特定用戶的文件或目錄,可以使用 -user 選項威始。
例:檢索根目錄下所有屬主為 starky 的文件

find / -type f -user starky

類似于 -user選項枢纠,-group 選項則可以根據文件或目錄的屬組進行檢索。

6. 根據時間日期進行檢索

有些時候黎棠,需要根據文件創(chuàng)建或修改的時間進行檢索晋渺。

Linux 系統中镰绎,與文件相關聯的時間參數有以下三種:

  • 修改時間(Modification time):最后一次文件內容有過更改的時間點
  • 訪問時間(Access time):最后一次文件有被讀取過的時間點
  • 變更時間(Change time):最后一次文件有被變更過的時間點(如內容被修改,或權限等 metadata 被修改)

與此對應的是 find 命令中的 -mtime木西,-atime-ctime 三個選項畴栖。

這三個選項的使用遵循以下示例中的規(guī)則:

  • -mtime 2:該文件 2 天前被修改過
  • -mtime -2:該文件 2 天以內被修改過
  • -mtime +2:該文件距離上次修改已經超過 2 天時間

檢索 /usr 下兩天前被修改過的文件

find /usr -type f -mtime 2

如果覺得 -mtime 等選項以為單位時間有點長,還可以使用 -mmin八千,-amin吗讶,-cmin 三個選項。

檢索 /usr 下 50 到 100 天之前修改過的文件
find /usr -type f -mtime +50 -mtime -100


檢索 /usr 下兩天前被修改過且 5 分鐘前又讀取過的文件
find /usr -type f -mtime 2 -amin 5

查找2004-11-30 16:36:37時更改過的文件
A=`find ./ -name "*php"` |   ls -l –full-time $A 2>/dev/null | grep "2004-11-30 16:36:37"

7. 按文件新舊

查找比 aa.txt 的文件

find . -newer "aa.txt" -type f -print   

查找比 aa.txt 的文件

find . ! -newer "aa.txt" -type f -print   

查找比aa.txt新叼丑,比bb.txt舊的文件

find . -newer 'aa.txt' ! -newer 'bb.txt' -type f -print 

8. 根據文件大小檢索

-size 選項允許用戶通過文件大小進行搜索(只適用于文件关翎,目錄沒有大小……)。

表示文件大小的單位由以下字符組成:

  • c:字節(jié)
  • k:Kb
  • M:Mb
  • G:Gb

另外鸠信,還可以使用 +- 符號表示大于小于當前條件纵寝。

檢索文件大小高于 1 GB 的文件

find / -size +1G

9. 根據文件權限檢索

find 命令可以使用 -perm 選項以文件權限為依據進行搜索。

9.1使用符號形式

例1:如需要檢索 /usr 目錄下權限為 rwxr-xr-x 的文件星立,可以使用以下命令:

find /usr -perm u=rwx,g=rx,o=rx

例2:搜索 /usr 目錄下所有權限為 r-xr-xr-x(即系統中的所有用戶都只有讀寫權限)的文件和目錄爽茴,可以使用以下命令:

find /usr -perm a=rx

很多時候,我們只想匹配文件權限的一個子集绰垂。比如室奏,檢索可以直接被任何用戶執(zhí)行的文件,即只關心文件的執(zhí)行權限劲装,而不用管其讀寫權限是什么胧沫。

上述的需求可以通過以下命令實現:

find / -type f -perm /a=x

其中 a=x 前面的 / 符號即用來表示只匹配權限的某個子集(執(zhí)行權限),而不用關心其他權限的具體設置占业。

9.2使用數字形式
例如:搜索 /usr 目錄下權限為 644(即 rwxr-xr-x)的文件

find /usr -perm 644

10. 限制遍歷的層數

find 命令默認是以遞歸的方式檢索項目的绒怨,這有時候會導致得到的結果數量非常巨大∏玻可以使用 -maxdepth 限制 find 命令遞歸的層數南蹂。

例如:搜索時向下遞歸的層數最大為 3

find / -maxdepth 3

11. 邏輯組合

在之前的例子中有出現多個搜索條件的組合以及對某個搜索條件的反轉
實際上 find 命令支持 “and”“or” 兩種邏輯運算念恍,對應的命令選項分別是 -a-o六剥。通過這兩個選項可以對搜索條件進行更復雜的組合。

此外還可以使用小括號對搜索條件進行分組峰伙。注意 find 命令中的小括號常需要用單引號包裹起來疗疟。因小括號在 Shell 中有特殊的含義。

如檢索 /usr 下文件名以 python 開頭且類型為目錄的文件

find /usr -type d -name 'python*'

該命令等同于:

find /usr -type d -a -name 'python*'

更復雜的組合形式如:

find / '(' -mmin -5 -o -mtime +50 ')' -a -type f

例4:在除dir0及子目錄以外的目錄下查找txt后綴文件

find ./ -path './dir0*' -a -prune -o -name '*.txt' -print

說明:-a 應該是and的縮寫词爬,意思是邏輯運算符‘與’(&&); -o應該是or的縮寫,意思是邏輯運算符‘或’(||), -not 表示非.

命令行的意思是:如果目錄dir0存在(即-a左邊為真)秃嗜,則求-prune的值,-prune 返回真,‘與’邏輯表達式為真(即-path './dir0*' -a -prune 為真)锅锨,find命令將在除這個目錄以外的目錄下查找txt后綴文件并打印出來叽赊;如果目錄dir0不存在(即-a左邊為假),則不求值-prune 必搞,‘與’邏輯表達式為假必指,則在當前目錄下查找所有txt后綴文件。

三恕洲、對搜索結果執(zhí)行命令

1. 刪除文件

-delete 選項可以用來刪除搜索到的文件和目錄塔橡。

例如:刪除 home 目錄下所有的空目錄:

find ~ -type d -empty -delete

2. 執(zhí)行自定義命令

2.1-exec 執(zhí)行自定義命令

-exec 選項可以對搜索到的結果執(zhí)行執(zhí)行該參數所給出的shell命令。形式為command {} \;霜第,注意{}與\;之間有空格 葛家。每當 find 命令檢索到一個符合條件的文件,會使用其完整路徑取代命令中的 {}泌类,然后執(zhí)行 -exec 后面的命令一次癞谒。

例1:如需要將 home 目錄下所有的 MP3 音頻文件復制到移動存儲設備(假設路徑是 /media/MyDrive),可使用下面的命令:

find ~ -type f -name '*.mp3' -exec cp {} /media/MyDrive ';'
find ~ -type f -name '*.mp3' -exec cp {} /media/MyDrive \;

其中的大括號{})作為檢索到的文件的 占位符 刃榨,而分號( ;)作為命令結束的標志弹砚。因為分號是 Shell 中有特殊含義的符號,所以需要使用單引號括起來或前面加上轉義符\枢希。

例2:查看當前目錄下的所有普通文件桌吃,并在 - exec 選項中使用 ls -l 命令將它們列出

find . -type f -exec ls -l {} \; 
-rw-r–r–    1 root      root         34928 2003-02-25   ./conf/httpd.conf 
-rw-r–r–    1 root      root         12959 2003-02-25   ./conf/magic 
-rw-r–r–    1 root      root          180 2003-02-25   ./conf.d/README 

例3:在多個文件中檢索某個指定的字符串。如在用戶主目錄下的所有文件中檢索字符串 hello 苞轿,可以使用如下命令:

find ~ -type f -exec grep -l hello {} ';'

-exec 選項中的 + 符號

創(chuàng)建 Gzip 格式的壓縮文件的命令為:

tar -czvf filename.tar.gz <list of files>

現在假設需要將用戶主目錄下所有的 MP3 文件添加到壓縮包 music.tar.gz 中茅诱,直觀的感覺是,其命令應為如下形式:

find ~ -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} ';'

實際情況是搬卒,這樣得到的 music.tar.gz 其實只包含一個 MP3 文件让簿。原因是 find 命令每次發(fā)現一個音頻文件,都會再執(zhí)行一次 -exec 選項后面的壓縮命令秀睛。導致先前生成的壓縮包被覆蓋。

可以先讓 find 命令檢索出所有符合條件的音頻文件莲祸,再將得到的文件列表傳遞給后面的壓縮命令蹂安。完整的命令如下:

find ~ -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} +

顯示文件信息

如果想瀏覽搜索到的文件(目錄)的詳細信息(如權限和大小等),可以直接使用 -ls 選項锐帜。

例如:瀏覽所有 1G 以上大小的文件的詳細信息

find / -type file -size +1G -ls

2.2 -ok

與exec作用相同田盈,區(qū)別在于,在執(zhí)行命令之前缴阎,都會給出提示允瞧,讓用戶確認是否執(zhí)行

2.3 |xargs

exec作用相同 ,起承接作用。區(qū)別在于 |xargs 主要用于承接刪除操作 述暂,而 -exec 都可用 如復制痹升、移動、重命名等

find   /etc -name "passwd*"   -exec grep   "cnscn"   {}   \;   #看是否存在cnscn用戶
find . -name "yao*"   | xargs file
find   . -name "yao*"   |   xargs   echo    "" > /tmp/core.log
find   . -name "yao*"   | xargs   chmod   o-w

四畦韭、實例

例1:查找以ap或may開頭的文件

find   -name ap* -o -name may*   

例2:查硬連接數大于2的文件或目錄

find   /home   -links   +2               

例3:查找含特定字符串的文件疼蛾。查找當前目錄下含有"the string you want find…"字符串的文件:

find . -type f -exec grep “the string you want find…” {} ; -print

例4:從根目錄開始查tmpfile,一旦查到馬上刪除

find / -name "tmpfile" -exec rm {} \;

例5:如何用find查找某一天更改的文件艺配?可以使用這一行命令來實現:

A=`find ~ -print` | ls -l –full-time $A 2>/dev/null | grep "Jun 27" | grep 1998

參考資料

A Guide to the Linux “Find” Command
https://www.cnblogs.com/wanqieddy/archive/2011/06/09/2076785.html
https://blog.csdn.net/l_liangkk/article/details/81294260
https://blog.csdn.net/hetoto/article/details/84101745
http://c.biancheng.net/view/779.html
http://blog.chinaunix.net/uid-24648486-id-2998767

https://www.runoob.com/linux/linux-comm-find.html

https://www.jb51.net/article/147275.htm

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末察郁,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子转唉,更是在濱河造成了極大的恐慌皮钠,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赠法,死亡現場離奇詭異麦轰,居然都是意外死亡,警方通過查閱死者的電腦和手機期虾,發(fā)現死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門原朝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人镶苞,你說我怎么就攤上這事喳坠。” “怎么了茂蚓?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵壕鹉,是天一觀的道長。 經常有香客問我聋涨,道長晾浴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任牍白,我火速辦了婚禮脊凰,結果婚禮上,老公的妹妹穿的比我還像新娘茂腥。我一直安慰自己狸涌,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布最岗。 她就那樣靜靜地躺著帕胆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪般渡。 梳的紋絲不亂的頭發(fā)上懒豹,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天芙盘,我揣著相機與錄音,去河邊找鬼脸秽。 笑死儒老,一個胖子當著我的面吹牛,可吹牛的內容都是我干的豹储。 我是一名探鬼主播贷盲,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼剥扣!你這毒婦竟也來了巩剖?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤钠怯,失蹤者是張志新(化名)和其女友劉穎佳魔,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體晦炊,經...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡鞠鲜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了断国。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贤姆。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖稳衬,靈堂內的尸體忽然破棺而出霞捡,到底是詐尸還是另有隱情,我是刑警寧澤薄疚,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布碧信,位于F島的核電站,受9級特大地震影響街夭,放射性物質發(fā)生泄漏砰碴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一板丽、第九天 我趴在偏房一處隱蔽的房頂上張望呈枉。 院中可真熱鬧,春花似錦埃碱、人聲如沸碴卧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至婶博,卻和暖如春瓮具,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工名党, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叹阔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓传睹,卻偏偏與公主長得像耳幢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子欧啤,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內容