从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函数来代替。 或者 ,你可以等一个像我这样疯狂的人在网上发布:
grep --exclude-dir=".svn"
因为名称“.svn”是相当独特的作品。 但是这可能会失败一个更广义的名字。
grep --exclude-dir="work"
是不是防弹,如果你有“/家庭/用户/工作”和“/家庭/用户/东西/工作”它将跳过这两个。 不可能将“/ * / work / *”定义为仅限于以前的文件夹名称。 据我所知,在GNU grep中,简单的–exclude不会排除目录。
两个greps将做的伎俩:
- 第一个grep将得到一切。
-
第二个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选项是你正在寻找的。