Posted on 2009-06-04 09:21
林光炎 閱讀(1515)
評論(0) 編輯 收藏 所屬分類:
LINUX
巧用find解決在目錄查找特定字符串
有時候需要在一個目錄下的所有文件查找含有特定字符串的文件,及特定字符串在文件中的定位。
自然反應肯定是使用grep命令,加上-r參數。
grep -r "pattern" .
可是如果待查找的目錄是SVN目錄,然后,主目錄下面又有N多子目錄,再用grep可就慘了,會查出好多.svn目錄下含有該字符串的文件,而這些文件是 創建SVN目錄時由 tortoiseSVN自動創建的輔助目錄。這些文件我們是不修改的。但是大量這樣的文件會嚴重影響我們的修改速度。
grep有--exclude參數,
grep -r --exclude=.svn "pattern" .
但是這只能排除掉主目錄下邊的.svn目錄,對于子目錄里的.svn就無能為力了。
這時候就該find命令上場了。先說一下find中對我們最有用的參數-prune
如果在查找文件時希望忽略某個目錄,那么可以使用-prune選項來指出需要忽略的目錄。
比如要在當前目錄下查找不在.svn子目錄之內的所有文件
find . -path "*\.svn" -prune -o -print
-path "*\.svn" -prune -o -print 是 -path "*\.svn" -a -prune -o -print 的簡寫表達式。
按順序求值, -a 和 -o 都是短路求值,與 shell 的 && 和 || 類似。
如果 -path "*\.svn" 為真,則求值 -prune , -prune 返回真,與邏輯表達式為真;否則不求值 -prune,與邏輯表達式為假。
如果 -path "*\.svn" -a -prune 為假,則求值 -print ,-print返回真,或邏輯表達式為真;否則不求值 -print,或邏輯表達式為真。
這個表達式組合特例可以用偽碼寫為
if -path "*\.svn" then
-prune
else
-print
如果需要避開多個文件夾,可以使用下面的命令:
find . \( -path dir1 -o -path file1 \) -prune -o -print
圓括號表示表達式的結合。
\ 表示引用,即指示 shell 不對后面的字符作特殊解釋,而留給 find 命令去解釋其意義。
查找某一確定文件,-name等選項加在-o 之后
#find . \(-path dir1 -o -path file1 \) -prune -o -name "temp" -print
排除目錄已經做到了, 下一步就是用grep去搜索特定串了.結合xargs使用即可.
find . -path "*\.svn" -prune -o -print|xargs grep "CodeType" -n |