巧用find解決在目錄查找特定字符串

          Posted on 2009-06-04 09:21 林光炎 閱讀(1520) 評論(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

          posts - 104, comments - 33, trackbacks - 0, articles - 0

          Copyright © 林光炎

          主站蜘蛛池模板: 托里县| 宁蒗| 颍上县| 通州市| 延庆县| 荔浦县| 牙克石市| 如东县| 广昌县| 禹城市| 谢通门县| 温泉县| 万荣县| 井陉县| 峡江县| 黄冈市| 绍兴县| 高雄市| 贡嘎县| 阳东县| 文水县| 林周县| 定南县| 清水县| 钦州市| 绥滨县| 巴塘县| 兰溪市| 澄城县| 翁牛特旗| 石阡县| 和顺县| 邹城市| 安顺市| 临安市| 恩施市| 南乐县| 醴陵市| 沾化县| 新乡市| 田林县|