递归搜索文件夹但排除 svn 子文件夹

递归搜索文件夹但排除 svn 子文件夹

我想找到fooSVN 维护的大型文件系统中所有出现的情况,但我不想匹配任何.svn目录中包含的任何内容。

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

我究竟做错了什么?

答案1

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

grep -l -e 'foo' --exclude-dir=".svn"*

考虑使用确认.svn默认情况下排除类似的文件夹(并具有许多其他功能)。

答案2

您可能感兴趣确认。它执行递归搜索(以及其他类似 grep 的操作),并排除诸如.svn或者.git默认情况下。

答案3

解决grep --exclude-dir...方案应该没问题,但只是为了展示另一种方式,您可以使用find's执行此操作-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 {} \;

答案4

如果您不想 grep 进入诸如.svn 曾经您可以设置$GREP_OPTIONS变量以排除它,如下所示:

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

只需将此行添加到您.bashrc的递归 grep 将不再进入.svn目录。当然,它可以随你的需要而丰富:

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

相关内容