从grep中排除.svn目录

当我grep我的Subversion的工作副本目录,结果包括从.svn目录很多文件。 是否可以recursion地grep一个目录,但从.svn目录中排除所有结果?

如果你有GNU Grep,它应该像这样工作:

grep --exclude-dir=".svn" 

如果碰巧在没有GNU Grep的Unix系统上,请尝试以下操作:

 grep -R "whatever you like" *|grep -v "\.svn/*" 

如果你使用ack (一个'更好的grep'),它会自动处理这个(并做很多其他聪明的事情呢!)。 这是值得一试的。

对于grep> = 2.5.1a

你可以把它放到你的环境中(例如.bashrc

 export GREP_OPTIONS='--exclude-dir=".svn"' 

PS:感谢Adrinan,在我的版本中有额外的引号:

 export GREP_OPTIONS='--exclude-dir=.svn' 

psychoschlumpf是正确的,但它只适用于如果你有最新版本的grep 。 早期版本没有--exclude-dir选项。 但是,如果您有一个非常大的代码库,双重grep -ing可以永远。 把它放在你的.bashrc以得到一个可移植的.svn -less grep:

 alias sgrep='find . -path "*/.svn" -prune -o -print0 | xargs -0 grep' 

现在你可以做到这一点:

 sgrep some_var 

…并获得预期的结果。

当然,如果你是一个像我这样疯狂的人,只需要使用相同的.bashrc ,你可以花4个小时写一个简单的bash函数来代替。 或者 ,你可以等一个像我这样疯狂的人在网上发布:

http://gist.github.com/573928

 grep --exclude-dir=".svn" 

因为名称“.svn”是相当独特的作品。 但是这可能会失败一个更广义的名字。

 grep --exclude-dir="work" 

是不是防弹,如果你有“/家庭/用户/工作”和“/家庭/用户/东西/工作”它将跳过这两个。 不可能将“/ * / work / *”定义为仅限于以前的文件夹名称。 据我所知,在GNU grep中,简单的–exclude不会排除目录。

两个greps将做的伎俩:

  1. 第一个grep将得到一切。
  2. 第二个grep将使用第一个grep的输出作为input(通过pipe道)。 通过使用-v标志,grep将select不符合search条件的行。 瞧。 在文件path中,您将剩下来自第一个不包含.svn的grep的所有输出。

    -v,–invert-match反转匹配的意义,select不匹配的行。

     grep the_text_you_want_to_search_for * |  grep -v .svn
    

我在我庞大的代码库上尝试了两次grep'in,并花了很长时间,所以我在我的同事的帮助下得到了这个解决scheme

修剪是更快的,因为它停止find处理这些目录相比,'grep -v'处理一切,只排除显示结果

 find . -name .svn -prune -o -type f -print0 | xargs -0 egrep 'YOUR STRING' 

您也可以将.bashrc中的这个命令别名为

 alias sgrep='find . -name .svn build -prune -o -type f -print0 | xargs -0 egrep ' 

现在简单地使用

 sgrep 'whatever' 

在我的GNU grep 2.5中,– --exclude-dirs不是一个有效的选项。 作为一种替代scheme,这对我来说效果很好:

 grep --exclude="*.svn-base" 

这应该是比排除包含.svn/所有行更好的解决scheme,因为它不会意外地过滤出真实文件中的这些行。

对于grep版本2.5.1,您可以添加多个--exclude项目来过滤掉.svn文件。

 $ grep -V | grep grep grep (GNU grep) 2.5.1 GREP_OPTIONS="--exclude=*.svn-base --exclude=entries --exclude=all-wcprops" grep -l -R whatever ./ 

另一个select,尽pipe可能不被认为是一个可以接受的答案是克隆回购入git和使用git grep

很less见到svn仓库非常庞大,通过git-svn进行克隆是不切实际的。 在这些极less数情况下,我使用了双重grep解决schemesvngrep ,但是在这里有很多答案指出,这可能会在大型版本库中变慢,并排除不是目录的“.svn”。 我会争辩说,这些将是非常less见,但…

另外关于多重grep的慢性能,一旦你使用了像git之类的东西,几乎所有的东西在svn中都显得很慢!

最后一件事情是,我的svngrep的变体经过着色,提防,执行是丑陋的! 大致grep -rn "$what" $where | egrep -v "$ignore" | grep --color "$what" grep -rn "$what" $where | egrep -v "$ignore" | grep --color "$what"

我认为recursion的–exclude选项是你正在寻找的。