我想找到foo
SVN 维护的大型文件系统中所有出现的情况,但我不想匹配任何.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=\*~"