shell中find命令的使用要點 linux中的find的命令尋找檔案的重要方式,輔以其他的bash命令可以實現強大的操作效果。 先看看放find命令的基本組成: find pathname -option [-print -exec -ok ...] 分類記憶各項屬性參數~ pathname:指定find命令的查詢根路徑,例如 ‘ / ’,‘./ ' 等。 同時還可在-path參數中指定搜尋路徑。 -option: 1、檔案操作: -name 用引號” “將查詢的檔案名稱括起來,可適用於簡單的Regex(應改為shell的元字元,下同)。 -type 指定尋找檔案的類型 b - 塊裝置檔案。 d - 目錄。 c - 字元裝置檔案。 p - 管道檔案。 l - 符號連結檔案。 f - 普通檔案。 -size n 指定檔案大小,若數字前+表示大於,-表示小於;常用單位c(位元組),k(KB),M(MB) 2、使用者權限: -perm 使用者權限permission,用常用的三位元字,如644表示許可權。若數字前+表示至少包括指定的一種存取權限,-表示必須包括指定的所有存取權限 -user / -nouser 按檔案屬主查詢 / 尋找無有效屬主的檔案 -group / -nogroup 按檔案所屬租來查 / 尋找無有效所屬租的檔案 3、時間選項: -atime / -amin n 最近訪問(accessed)過的檔案,前者表示單位是天(24h),後者單位是分鐘(minute);若數字前+表示n段時間前,-表示最近n段時間。後同。 -ctime / -cmin n 最近狀態改變(changed)過的檔案 -mtime / -mmin n 最近內容修改(modified)過的檔案 -newer file!otherfile 尋找更改時間比file新的檔案,加上非(!)則尋找比otherfile舊的檔案 (注意,邏輯符號包括!(not)、-a(and)、-o(or),在命令中都是短路求值,簡單講就是若後面的參數不影響邏輯判斷,則不對後面求值。在find命令中一般在選項之前添加邏輯符號) 4、檔案路徑: -follow 遇到符號連結檔案,就跟蹤到連結指向的檔案 -mount 不跨越檔案系統的mount點,即在當前的檔案系統查詢,不進入其他檔案系統(如掛載的windows系統) -path 給出檔案路徑,可在路徑中查詢,滿足簡單Regex(元字元)。例如尋找當前路徑中' ./var/www '子目錄中的’ index.html ’ 檔案: $ find . -path './var/www*' -name 'index.html' -print ./var/www/learn/study_smarty/templates/index.tpl./var/www/learn/study_smarty/docs/index.php./var/www/learn/index.php./var/www/index.html (結果中可以看到,-path選項中的參數要為模糊的查詢條件,我理解的-path選項尋找出的檔案名稱實際上是帶路徑的字串,而-path中則是滿足結果字串中的前面的路徑字元。) -prune 指出要忽略的目錄。結合-path選項,例如在目前的目錄下尋找‘ index.html ’檔案,同時忽略路徑下的‘ /www/bin ’目錄: $ find . -path './www/bin' -prune -o -name 'index.html' -print -path “./www/bin” -prune -o -name 'index.html' -print 是 -path “./www/bin” -a -prune -o -name 'index.html' -print 的簡寫運算式。按順序求值,-a 和 -o 都是短路求值,與 shell 的 && 和 || 類似如果 -path “./www/bin” 為真,則求值 -prune , -prune 返回真,“與”邏輯運算式為真;否則不求值 -prune,與邏輯運算式為假。如果 -path “/usr/sam” -a -prune 為假,則求值 -name。-name返回真,“或”邏輯運算式為真;否則不求值 -name,“或”邏輯運算式為真。 (因此,其他的查詢條件必須放在-o之後!而-path選項一般放在最前,-prune和-o也要連用) 避開多個檔案可以用: $ find /usr \(-path /usr/dir1 -o -path /usr/dir2 \) -prune -o -name "index.html" -print ‘ \(’ 與 ‘ \) ’ 表示轉義,及shell不再對括弧做特殊解釋,這裡轉義後的括弧表示結合。 (注意,路徑後不能在加 ‘/’ 號!) -depth 先匹配所有的檔案,再在子目錄中尋找。即廣度遍曆查詢。注意加上-depth選項後,-prune選項失效。 5、查詢執行: -exec command {} \; 對查詢的結果檔案執行command 命令,{}中就包含著查詢結果。 -ok command {} \; 與-exec有著相同的操作,不同的是,在執行command命令時會有互動提示你是否執行,是一種相對安全的做法。 在使用find命令的-exec選項處理匹配到的檔案時, find命令將所有匹配到的檔案一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘之後,就會出現溢出錯誤。錯誤資訊通常是“參數列太長”或“參數列溢出”。在有些系統中,使用-exec選項會為處理每一個匹配到的檔案而發起一個相應的進程,並非將匹配到的檔案全部作為參數一次執行;這樣在有些情況下就會出現進程過多,系統效能下降的問題,因而效率不高。 xargs 與pipe連用,對匹配的檔案執行操作。 find命令把匹配到的檔案傳遞給xargs命令,而xargs命令每次只擷取一部分檔案而不是全部,不像-exec選項那樣。這樣它可以先處理最先擷取的一部分檔案,然後是下一批,並如此繼續下去。使用xargs命令則只有一個進程。轉 例如,在當前路徑下的普通檔案中搜尋‘ admin ’: $ find . -type f -print | xargs grep 'admin' 對於一個參數的命令,xargs隱含傳遞匹配檔案,如上述grep files,將結果隱含傳遞給files。如是多參數命令,如cp file dir,則要利用xargs的 -i 選項,例如將上述查詢的問價copy至‘ /usr ’: $ find . -type f -print | xargs -i cp {} /usr/ 加上 -i 選項後,xargs將匹配的結果傳遞給 {} ,這樣就方便多參數命令的使用了。