当我grep我的Subversion工作副本目录时,结果包含来自.svn目录的大量文件。是否可以递归grep目录,但排除.svn目录中的所有结果?
答案 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函数来代替。 或,你可以等待像我这样疯狂的人在网上发布:
答案 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会做到这一点:
第二个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选项就是你要搜索的内容。