当我对 Subversion 工作副本目录进行 grep 时,结果将包含来自。Svn 目录。是否可以递归地对目录进行 grep,但从。Svn 目录?
如果你使用 啊(一个“更好的 grep”) ,它会自动处理这个问题(还会做很多其他聪明的事情!).值得一查。
如果你有 GNU Grep,它应该是这样工作的:
grep --exclude-dir=".svn"
如果正好在一个没有 GNU Grep 的 Unix 系统上,请尝试以下操作:
grep -R "whatever you like" *|grep -v "\.svn/*"
我认为您正在寻找的是递归的排除选项。
因为名称“ . svn”是相当独特的。但是这可能在更广义的名称上失败。
grep --exclude-dir="work"
不是防弹的,如果你有“/home/user/work”和“/home/user/stuff/work”,它会跳过这两个 将排除限制为只包含前一个文件夹名称。 就我的实验而言,在 GNU grep 中,simple- 排除不會排除目录。
两个 Greps 就够了:
第二个 grep 将使用第一个 grep 的输出作为输入(通过管道)。通过使用-v 标志,grep 将选择与搜索条件不匹配的行。瞧。您将获得第一个 grep 中不包含的所有输出。文件路径中的 svn。
- V-反转匹配 反转匹配感,选择不匹配的行。
grep the_text_you_want_to_search_for * | grep -v .svn
Psyoschlumpf 是正确的,但它只有在你有最新版本的 grep的情况下才能工作。早期版本没有 --exclude-dir选项。然而,如果你有一个非常大的代码库,双 grep-ing 可能需要很长时间。把这个放到你的 .bashrc中,就可以得到一个便携式的 .svn-less grep:
grep
--exclude-dir
.bashrc
.svn
alias sgrep='find . -path "*/.svn" -prune -o -print0 | xargs -0 grep'
现在你可以这样做:
sgrep some_var
得到预期的结果。
当然,如果你像我一样,只是在 已经中使用相同的 .bashrc,你可以花4个小时写一个过于复杂的 bash 函数来代替。或者,你可以等着像我这样的疯子把它发到网上:
Http://gist.github.com/573928
对于 grep > = 2.5.1 a
你可以把它放到你的环境中(例如 .bashrc)
export GREP_OPTIONS='--exclude-dir=".svn"'
附注: 多亏了 Adrinan,我的版本中多了一些引用:
export GREP_OPTIONS='--exclude-dir=.svn'
PPS: 这个 env 选项被标记为弃用: https://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html“ 由于这会在编写可移植脚本时引起问题,所以在将来的 grep 版本中将删除这个特性,如果使用了 grep,它会发出警告。请使用别名或脚本代替。”
我在我的庞大代码库上尝试了双 grep‘ in,这花了我很长时间,所以我在同事的帮助下得到了这个解决方案
与“ grep-v”相比,它停止处理这些目录中的 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'
对于 grep 版本2.5.1,您可以添加多个 --exclude项来过滤掉 .svn文件。
--exclude
$ grep -V | grep grep grep (GNU grep) 2.5.1 GREP_OPTIONS="--exclude=*.svn-base --exclude=entries --exclude=all-wcprops" grep -l -R whatever ./
另一种选择,尽管可能不会被认为是 可以接受的答案,是将回购克隆到 git 中并使用 git grep。
git grep
我很少遇到如此庞大的 svn 存储库,通过 git-svn进行克隆是不切实际的。在这些罕见的情况下,我使用双 grep 解决方案 Svngrep,但是正如这里的许多答案所表明的那样,这在大型存储库中可能会比较慢,并且会排除’。不是目录的 svn 出现。我认为这种情况极其罕见。
git-svn
同样关于多个 grep 的缓慢性能,一旦您使用了类似 git 的东西,几乎所有的东西在 svn 中看起来都很慢!
最后一件事. . ,我的 svngrep 变体通过着色,注意,实现是丑陋的! 大致 grep -rn "$what" $where | egrep -v "$ignore" | grep --color "$what"
grep -rn "$what" $where | egrep -v "$ignore" | grep --color "$what"
在我的 GNU grep 2.5中,--exclude-dirs不是一个有效的选项:
--exclude-dirs
grep --exclude="*.svn-base"
与排除所有包含 .svn/的行相比,这应该是一个更好的解决方案,因为它不会意外地过滤掉实际文件中的这些行。
.svn/