从 grep 中排除.svn 目录

当我对 Subversion 工作副本目录进行 grep 时,结果将包含来自。Svn 目录。是否可以递归地对目录进行 grep,但从。Svn 目录?

61402 次浏览

如果你使用 (一个“更好的 grep”) ,它会自动处理这个问题(还会做很多其他聪明的事情!).值得一查。

如果你有 GNU Grep,它应该是这样工作的:

grep --exclude-dir=".svn"

如果正好在一个没有 GNU Grep 的 Unix 系统上,请尝试以下操作:

grep -R "whatever you like" *|grep -v "\.svn/*"

我认为您正在寻找的是递归的排除选项。

grep --exclude-dir=".svn"

因为名称“ . svn”是相当独特的。但是这可能在更广义的名称上失败。

grep --exclude-dir="work"

不是防弹的,如果你有“/home/user/work”和“/home/user/stuff/work”,它会跳过这两个 将排除限制为只包含前一个文件夹名称。 就我的实验而言,在 GNU grep 中,simple- 排除不會排除目录。

两个 Greps 就够了:

  1. 第一个人会得到一切。
  2. 第二个 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:

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文件。

$ 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

我很少遇到如此庞大的 svn 存储库,通过 git-svn进行克隆是不切实际的。在这些罕见的情况下,我使用双 grep 解决方案 Svngrep,但是正如这里的许多答案所表明的那样,这在大型存储库中可能会比较慢,并且会排除’。不是目录的 svn 出现。我认为这种情况极其罕见。

同样关于多个 grep 的缓慢性能,一旦您使用了类似 git 的东西,几乎所有的东西在 svn 中看起来都很慢!

最后一件事. . ,我的 svngrep 变体通过着色,注意,实现是丑陋的! 大致 grep -rn "$what" $where | egrep -v "$ignore" | grep --color "$what"

在我的 GNU grep 2.5中,--exclude-dirs不是一个有效的选项:

grep --exclude="*.svn-base"

与排除所有包含 .svn/的行相比,这应该是一个更好的解决方案,因为它不会意外地过滤掉实际文件中的这些行。