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

MUY*_*ium 27 grep recursive

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

$ grep some_string * -r
lang/en:some_string=Some string
lang/.svn/en:some_string=Some string
Run Code Online (Sandbox Code Playgroud)

但是,如果再进一步,似乎排除了一级隐藏目录:

$ cd lang && grep some_string * -r
en:some_string=Some string
Run Code Online (Sandbox Code Playgroud)

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

$ grep some_string * -r --which_option_here?
lang/en:some_string=Some string
Run Code Online (Sandbox Code Playgroud)

jim*_*mij 30

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

grep -r --exclude-dir='.*' some_string
Run Code Online (Sandbox Code Playgroud)

来自man grep

--exclude-dir=DIR
              Exclude directories matching the pattern DIR from recursive searches.
Run Code Online (Sandbox Code Playgroud)

但是请注意,该--exclude-dir选项仅在 GNU grep 中可用。如果您grep不支持它,您可能需要使用其他工具作为 find例如

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

  • 旁注:`grep -r --exclude-dir='.*' .` 将排除所有内容,因为当您指定 `.` 作为显式路径参数时,所有内容都以 `./` 开头。所以注意不要显式指定当前目录,或者使用像`--eclude-dir='.?*'`这样的排除模式,它只匹配和排除点后至少有一个字符的目录。 (3认同)