从grep中排除.svn目录

时间:2009-09-29 09:33:41

标签: linux bash svn grep

当我grep我的Subversion工作副本目录时,结果包含来自.svn目录的大量文件。是否可以递归grep目录,但排除.svn目录中的所有结果?

11 个答案:

答案 0 :(得分:265)

如果你有GNU Grep,它应该是这样的:

grep --exclude-dir=".svn"

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

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

答案 1 :(得分:36)

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

答案 2 :(得分:36)

对于grep> = 2.5.1a

您可以将其放入您的环境中(例如.bashrc

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

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

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

答案 3 :(得分:7)

psychoschlumpf是正确的,但只有拥有最新版本的grep才有效。早期版本没有--exclude-dir选项。但是,如果你有一个非常大的代码库,那么双倍grep可能需要永远。将其放在.bashrc中以获取便携式.svn - 更少grep:

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

现在你可以这样做:

sgrep some_var

...并获得预期的结果。

当然,如果你是一个疯狂的人,只是 在任何地方使用相同的.bashrc,你可以花4个小时写一个过于复杂的bash函数来代替。 ,你可以等待像我这样疯狂的人在网上发布:

http://gist.github.com/573928

答案 4 :(得分:2)

grep --exclude-dir=".svn"

有效,因为名称“.svn”相当独特。但这可能会失败,因为更广泛的名称。

grep --exclude-dir="work"

不是防弹的,如果您有“/ home / user / work”和“/ home / user / stuff / work”,它将跳过两者。无法定义“/ * / work / *”  将排除限制为仅限于以前的文件夹名称。 据我所知,在GNU grep中,简单的--exclude不会排除目录。

答案 5 :(得分:2)

在我的GNU grep 2.5上,--exclude-dirs不是有效选项。作为替代方案,这对我来说效果很好:

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

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

答案 6 :(得分:1)

两个greps会做到这一点:

  1. 第一个grep会得到一切。
  2. 第二个grep将使用第一个grep的输出作为输入(通过管道)。通过使用-v标志,grep将选择与搜索项不匹配的行。瞧。您将获得第一个grep中的所有输出,这些输出在文件路径中不包含.svn。

    -v, - 反转匹配       反转匹配感,选择不匹配的行。

    grep the_text_you_want_to_search_for * | grep -v .svn
    

答案 7 :(得分:1)

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

修剪速度要快得多,因为与处理所有内容并且仅排除显示结果的“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' 

答案 8 :(得分:1)

另一个选项,虽然可能不被视为可接受的答案,但是将repo克隆到git并使用git grep

很少,我遇到了如此庞大的svn存储库,通过git-svn进行克隆是不切实际的。在极少数情况下,我使用双grep解决方案svngrep,但是这里的答案很多,这在大型存储库中可能很慢,并且排除不是目录的“.svn”事件。我认为这些很少见,但是......

另外关于多个greps的缓慢性能,一旦你使用了像git之类的东西,svn中的一切似乎都很慢!

最后一件事......,我的svngrep变种通过着色,小心,实现是丑陋的!粗略地grep -rn "$what" $where | egrep -v "$ignore" | grep --color "$what"

答案 9 :(得分:0)

对于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 ./

答案 10 :(得分:-1)

我认为递归的--exclude选项就是你要搜索的内容。