巧用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 如果需要避開多個文件夾,可以使用下面的命令: 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 |