递归搜索文件夹,但不包括SVN子文件夹


10

我想查找foo由SVN维护的大型文件系统中的所有事件,但我不希望匹配任何.svn目录中包含的任何内容。

当我这样做grep -l -e 'foo' *时,我得到立即匹配,但是当我尝试使用grep -l -e 'foo' --exclude-dir=".svn"命令挂起svn目录时,它挂起了。

我究竟做错了什么?

Answers:


11

--exclude-dir并不需要在命令行上列出文件。您正在“挂”,因为grep正在等待标准输入。

grep -l -e'foo'--exclude-dir =“。svn” *

考虑使用ack.svn默认情况下不包括ack和类似的文件夹(并且具有许多其他功能)。


2
如果更改*.,则更干净,以防万一还有其他隐藏文件夹需要搜索。
凯文(Kevin)

或者也许您想使用它--recursive .,因为OP已经具有GNU了grep
jw013

就个人而言,我shopt -s dotglob在Bash中使用,因此*已经包含了点文件。 -r很好,但是ack默认情况下也可以做到这一点:)
ephemient

5

您可能对ack感兴趣。它会进行递归搜索(以及其他类似grep的操作),并且默认情况下会排除诸如.svn.git之类的目录


作为对此的后续工作,我目前使用ag,其相似但更快。
WhyNotHugo

2

grep --exclude-dir...解决方案应该可以,但是为了显示另一种方法,您可以使用find-prune

find -name .svn -prune -o -type f -exec grep -l "$pattern" {} +

如果您想进一步执行某事,find总比普通的要好grep -r

find -name .svn -prune -o -type f -exec grep -q "$pattern" {} \; -exec ./process {} \;

1

如果你不想给grep到的目录,例如.svn 以往你可以设置$GREP_OPTIONS变量排除如下:

export GREP_OPTIONS="--exclude-dir=\*/.svn/\*"

只需将这一行添加到您的目录中.bashrc,您的递归列表将不再进入.svn目录。当然,它可以随您想要的丰富:

export GREP_OPTIONS="--exclude-dir=\*/.svn/\* --exclude-dir=\*/.hg/\* --exclude-dir=\*/.git/\* --exclude=\*~"

1
我个人使用别名进行此操作,因此,如果我需要在这些文件夹中进行实际搜索,则可以绕过排除列表,我可以使用裸grep而不用取消/清空变量。它还使我可以维护一个文件夹列表,我可以轻松地对其进行扩展并自动将其添加到排除列表中,而无需进行更多输入。
Dragon788

那是个好方法。它还具有以下优点:如果需要grep进入文件夹,则不会忘记设置变量。(但并不是我曾经需要对它们进行grep。)但是TBH这些天来,我使用ag(ack克隆)来完成这些操作^^
brandizzi

0

这也是awk解决方案:

find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}'

基本上,从所有文件中删除与/.svn/匹配的文件,然后从其中仅打印与/ foo /匹配的文件。我也喜欢这种解决方案,因为您可以轻松地将结果与ls一起使用。例如,您可以使用

ls -tl $(find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}')

查看按修改日期排序的列表视图。另外,如果您要对结果进行其他操作(打开,执行等),最好拥有结果的完整路径。

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.