linux中的find的命令查找文件的重要方式,輔以其他的bash命令可以實現強大的操作效果。
先看看放find命令的基本組成:
find pathname -option [-print -exec -ok ...]
分類記憶各項屬性參數~
pathname:指定find命令的查詢根路徑,例如 ‘ / ’,‘./ ' 等。
同時還可在-path參數中指定搜索路徑。
-option:
1、文件操作:
-name 用引號” “將查詢的文件名括起來,可適用於簡單的正則表達式(應改為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 給出文件路徑,可在路徑中查詢,滿足簡單正則表達式(元字符)。例如查找當前路徑中' ./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選項失效。
-maxdepth n 設定遞歸搜索的目錄層級,1為在當前目錄下,即不遞歸搜索。
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將匹配的結果傳遞給 {} ,這樣就方便多參數命令的使用了。
ok,打完手工,歡迎交流。