find命令詳解

1. find命令簡介

find命令主要用于文件搜索,它的功能非常強大,可以根據不同的標準搜索任何文件,可以在任何位置進行檢索。find命令的主要格式如下:

find path test action

(1)path表示要搜索的路徑,可以同時指定多個路徑,路徑之間以空格隔開:

find /user/bin              #搜索/user/bin目錄和子目錄
find /                      #搜索根目錄及子目錄(實際上就是搜索整個文件系統)
find .                      #搜索當前目錄
find -root                  #搜索root用戶的主目錄
find /user/bin /home        #搜索/user/bin和/home目錄及它們的子目錄

(2)test表示測試條件,用戶可以指定多個測試條件來查找符合特定標準的文件,條件之間以空格隔開:

find / -type f              #搜索的文件類型:f=file d=directory
find / -name "*.txt"        #搜索文件名后綴為txt,*為通配符

下面是詳細測試條件表:

條件 說明
-name pattern 表示包含指定匹配模式的文件名,區分大小寫
-type pattern 指定文件類型
-perm mode 匹配權限被設置為指定mode的文件
-user userid 匹配所有者為指定用戶id的文件<
-group groupid 匹配所有者的主組為指定組id的文件
-size size 匹配大小為size的文件
-empty 匹配空文件
-amin [-+]n 文件最后一次訪問時間,-n表示訪問時間為距今n分鐘以內,+n表示訪問時間為距今n分鐘以前,n表示恰好n分鐘
-atime [-+]n 文件最后一次訪問時間,時間單位為天
-cmin [-+]n 文件最后一次狀態改變的時間,時間單位為分鐘
-ctime [-+]n 文件最后一次狀態改變的時間,時間單位為天
-mmin [-+]n 文件最后一次被修改的時間,時間單位為分鐘
-mtime [-+]n 文件最后一次被修改的時間,時間單位為天

(3)action表示對find結果執行操作。

|動作|說明|
|------ -----------|:----------------------------|
|-print|默認動作,將結果寫入到標準輸出|
|-fprint file|將結果寫入到文件file|
|-ls|以詳細格式顯示搜索結果|
|-fls file|將詳細格式的結果寫入到文件file|
|-delete|將搜索到的文件刪除<|
|-exec command {} ;|查找并執行命令,{}表示搜索到的文件名|
|-ok command {} ;|查找并執行命令,但是需要用戶確認|
-exec非常實用,使find命令對搜索結果中的文件執行指定的shell命令,其中command表示shell命令,大括號{}表示搜索結果中的文件名,最后的分號表示命令的結束,分號需要使用反斜線轉義。注意其中的空格。

find ./ -type f -mmin +5 -exec rm {} \;                 
    #找出當前目錄下最后一次在5分鐘以前修改過的文件并刪除。 

2.find命令的應用場景

(1) 使用find查找文件中包含指定字符串hello world的txt或者sh文件

find ./ -type f -name "*.sh" -o -name "*.txt" -exec grep -i "hello world" {} \+;
    # 注意{}兩端的空格。
    # “+”號的作用:可以打印出詳細結果,包括匹配文件名和匹配行內容
    # or:邏輯或,在命令中用“-o”表示。本例中表示sh文件或者txt文件都滿足測試條件。
    # and:邏輯與,系統默認選項,測試條件之間以空格隔開即可。
    # not :邏輯非,在命令中用“!”表示,例如:
    find ./ ! -name "*.sh"

那么能不能使用管道來實現呢?例如下面這樣:

find ./ -type f -name "*.sh" -o -name "*.txt" | grep -i "hello world"
    #不能得到結果。

這樣無法想要的結果,因為管道會把find的結果作為輸入賦給grep命令,這些結果只是文件名組成的字符串而不是文件的內容。

(2) 搭配xargs解決參數列太長導致溢出的錯誤

參考資料:Xargs用法詳解

在使用find命令的-exec選項處理匹配到的文件時,find命令將所有匹配到的文件一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘之后,就會出現 溢出錯誤。錯誤信息通常是“參數列太長”或“參數列溢出”。
可以把匹配到的文件傳遞給xargs命令,而xargs命令每次只獲取一部分文件而不是全部,不像-exec選項那樣。這樣它可以先處理最先獲取的一部分文件,然后是下一批,并如此繼續下去。
在使用xargs命令時,究竟是一次獲取所有的參數,還是分批取得參數,以及每一次獲取參數的數目都會根據該命令的選項及系統內核中相應的可調參數來確定。
并且,xargs可以把管道傳來的字符串當作文件去執行,這樣就解決了(1)中的問題。

find ./ -type f -name "*.sh" -o -name "*.txt" | xargs grep -i "hello world"

xargs就是為了能對find搜索到的文件進行操作而編寫的,還有很多其他的用途,例如:

find . -perm -7 -print | xargs chmod o-w  
    #在當前目錄下查找所有用戶具有讀、寫和執行權限的文件,并收回相應的寫權限。
find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz
    #查找所有的jpg 文件,并且壓縮它。
find ~ -name ‘*.log’ -print0 | xargs -i -0 rm -f {}
    #嘗試用rm刪除太多的文件,你可能得到一個錯誤信息:/bin/rm Argument list too long。用xargs去避免這個問題。
ls *.jpg | xargs -n1 -i cp {} /external-hard-drive/directory
    #拷貝所有的圖片文件到一個外部的硬盤驅動。

(3) 統計目錄中全部的文件數量及子目錄數量。

例如以下的shell腳本:

#! /bin/bash

files='find /etc -type f -print | wc -l'
    #統計文件數量
directories='find /etc -type d -print | wc -l'
    #統計子目錄數量
    echo "There are $files regular files in /etc dictionary."   
    echo "There are $directinories directinories in /etc dictionary."
    #輸出統計結果

(4) 設置crontab任務。

工作里很多task都要在服務器上進行,很難清晰的記錄到每一個自己所生成修改的文件,其中的權限問題可能會對其他人產生一些困擾。我們可以設置crontab任務,定時的修改自己文件所屬的組或者文件的權限來控制此問題。例如:

00 05 * * * find /path -user tyroneli -mtime -1 -exec chgrp groupid {} \;
#在每天5點,在path目錄下查找最后修改時間一天之內用戶名為tyroneli的文件或目錄,修改其所屬組。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內容

  • Linux系統「文件查找」 Linux系統文件中常用屬性為以下內容:名稱,大小,權限,屬主,屬組,修改時間,訪問時...
    魏鎮坪閱讀 7,934評論 0 3
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數據革命閱讀 12,193評論 2 33
  • 在linux下面工作,有些命令能夠大大提高效率。本文就向大家介紹find、grep命令,他哥倆可以算是必會的lin...
    拿破輪胎閱讀 983評論 0 4
  • find是Unix/Linux命令行工具箱中最棒的工具之一,該命令對于編寫shell腳本所起到的功用不可小視。 工...
    WenqiSun閱讀 2,052評論 0 4
  • 半個月不在家,一回家老媽就和我說:“我想做這個,人家一個月賺了好幾萬了呢!你也做,可以讓你朋友一起!”(我媽平時真...
    冰鎮火藥閱讀 289評論 1 2