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


22

我有一个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

不是直接的答案,但是您可能想尝试ack
2014年

Answers:


21

使用--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 \;

我必须拥有一个太旧的Linux ...
MUY比利时2014年

我已经编辑了答案,find如果您的grep不支持,请尝试使用该版本--exclude-dir
jimmij 2014年

我有grep版本2.5.1,没有--exclude-dir参数,我已经尝试了所有我想到的...
MUY比利时2014年

1
第二种解决方案不使用--exclude-dir,您尝试过吗?
jimmij 2014年

我有“未确认的选择”
MUY比利时

1

我通常使用这个:

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

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


代码说e#,文字说e%
Stephen Rauch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.