从 grep -r 中排除隐藏子目录

从 grep -r 中排除隐藏子目录

我有一个 svn 本地副本,我想搜索字符串 some_string。

$ grep some_string * -r
lang/en:some_string=Some string
lang/.svn/en:some_string=Some string

但如果更进一步,似乎第一级隐藏目录被排除在外:

$ cd lang && grep some_string * -r
en:some_string=Some string

如何从输出中删除隐藏的 svn 目录,而不仅仅是从第一个深度级别?

$ grep some_string * -r --which_option_here?
lang/en:some_string=Some string

答案1

使用--exclude-dir选项,例如:

grep -r --exclude-dir='.*' some_string

man grep

--exclude-dir=DIR
              Exclude directories matching the pattern DIR from recursive searches.

但请注意,该--exclude-dir选项仅在 GNU grep 中可用。如果你grep不支持它,你可能需要使用其他工具,如查找例如:

find . \( -name .svn -prune \) -o -name "*" -exec grep -H "some_string" {} 2>/dev/null \;

答案2

我通常使用这个:

for e in $(find . -maxdepth 1 -type d); do echo ${e#\./}; done | grep -v '^\.'

${e%\./}将删除第一个./,然后grep删除以点开头的所有内容。

答案3

在 OSX 上,我使用:

grep -lR --exclude-dir={'*node_modules*',build,'./.*'} 'SearchTerm'

相关内容