从 grep 中排除 .svn 目录 [重复]

Posted

技术标签:

【中文标题】从 grep 中排除 .svn 目录 [重复]【英文标题】:Exclude .svn directories from grep [duplicate] 【发布时间】:2010-12-02 06:25:29 【问题描述】:

当我 grep 我的 Subversion 工作副本目录时,结果包括很多来自 .svn 目录的文件。是否可以递归 grep 目录,但排除 .svn 目录中的所有结果?

【问题讨论】:

相关How can I exclude directories from grep -R? 【参考方案1】:

如果您使用ack(“更好的 grep”),它会自动处理这个问题(并且还会做很多其他聪明的事情!)。非常值得一试。

【讨论】:

+1 表示确认。我有一个 shell 别名,默认使用它。 这个确认真的很好。请注意,在 Ubuntu 和 Linux Mint 中,“ack”包与“ack-better grep”无关,后者位于“ack-grep”包中。 不幸的是没有解决all隐藏目录的问题(例如我不希望它下降到.stack-workdir),我也不太喜欢它的输出通过将文件名放在单独的行上来占用更多空间。所以我最终给 grep alias grepexclhid="grep --exclude-dir=\".*\"" 起了一个别名。【参考方案2】:

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

grep --exclude-dir=".svn"

如果碰巧在没有 GNU Grep 的 Unix 系统上,请尝试以下操作:

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

【讨论】:

在 Windows 版本的 GNU Grep 上,我不得不使用 --exclude-dir=\.svn 仅适用于 gnu grep 版本 >=2.5.1a 哈哈。我刚要投票,但我已经投票了。好像我以前来过这里:) +1 对于第二个例子,第一个对我使用 export GREP_OPTIONS="--exclude-dir=\".svn\" -nR --color" 的 GNU grep 2.6.3 不起作用 alias grepsvn='grep --exclude-dir=".svn"' grepsvn -R searchstring .【参考方案3】:

我认为递归的 --exclude 选项是您正在搜索的内容。

【讨论】:

--exclude 仅匹配文件模式,例如 *.java【参考方案4】:
grep --exclude-dir=".svn"

之所以有效,是因为“.svn”这个名字相当独特。但这可能会在更通用的名称上失败。

grep --exclude-dir="work"

不是防弹的,如果你有“/home/user/work”和“/home/user/stuff/work”,它会跳过这两个。无法定义“/*/work/*” 将排除限制为仅以前的文件夹名称。 据我所知,在 GNU grep 中,简单的 --exclude 不会排除目录。

【讨论】:

仅适用于 gnu grep 版本 >=2.5.1a 这应该是对已接受答案的评论,而不是答案本身。 @Dave:感谢您的提示。您刚刚评论了一条 2 年前的评论。【参考方案5】:

两个 grep 就可以解决问题:

    第一个 grep 将获取所有内容。

    第二个 grep 将使用第一个 grep 的输出作为输入(通过管道)。通过使用 -v 标志,grep 将选择与搜索词不匹配的行。瞧。剩下的是第一个 grep 的所有输出,文件路径中不包含 .svn。

    -v, --invert-match 反转匹配感,选择不匹配的行。

    grep the_text_you_want_to_search_for * | grep -v .svn

【讨论】:

第二个 grep 删除所有颜色格式。 另一个问题是它会删除所有碰巧有“.svn”的行,不管 .svn 是因为文件名,还是实际上在文件中。另一个问题是您花时间在 .svn 目录中搜索您知道要排除的文件。最好从一开始就 --exclude。 这也会浪费时间在 .svn 中查找匹配项,只是在事后过滤它们。【参考方案6】:

psychoschlumpf 是正确的,但它仅在您拥有最新版本的 grep 时才有效。早期版本没有--exclude-dir 选项。然而,如果你有一个非常大的代码库,double-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

【讨论】:

您上面列出的使用 find 和 xargs 的方法不起作用,至少在我的环境中的 RHEL5 上是这样。我仍然得到 .svn-base 列表。【参考方案7】:

对于 grep >=2.5.1a

你可以把它放到你的环境中(例如.bashrc

export GREP_OPTIONS='--exclude-dir=".svn"'

PS:感谢 Adrinan,我的版本中有额外的引号:

export GREP_OPTIONS='--exclude-dir=.svn'

PPS:此 env 选项已标记为弃用:https://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html"由于这会在编写可移植脚本时出现问题,因此该功能将在 grep 的未来版本中删除,如果使用,grep 会发出警告。请请改用别名或脚本。"

【讨论】:

你不需要双引号 - 当双引号出现时它对我不起作用 GREP_OPTIONS 在 2.20 之后不再是受支持的环境变量【参考方案8】:

我在我庞大的代码库上尝试了双重 grep'in,但它花了很长时间,所以我在同事的帮助下得到了这个解决方案

与处理所有内容并仅排除显示结果的“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' 

【讨论】:

【参考方案9】:

对于 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 ./

【讨论】:

【参考方案10】:

另一种选择,尽管可能不被视为可接受的答案是将 repo 克隆到 git 并使用 git grep

我很少遇到如此庞大的 svn 存储库,通过git-svn 克隆是不切实际的。在这些罕见的情况下,我使用双重 grep 解决方案,svngrep,但正如这里的许多答案所表明的那样,这在大型存储库上可能会很慢,并且排除不是目录的 '.svn' 事件。我会争辩说,这些将非常罕见......

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

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

【讨论】:

【参考方案11】:

在我的 GNU grep 2.5 上,--exclude-dirs 不是有效选项。作为替代方案,这对我来说效果很好:

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

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

【讨论】:

你注意到区别了吗,这是--exclude-dir 不是--exclude-dirs

以上是关于从 grep 中排除 .svn 目录 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

从搜索整个系统中排除目录[重复]

使用查找时排除文件夹[重复]

如何从 git grep 搜索中排除某些目录/文件

从颤振中排除 Web 部件 [重复]

从 .net 6 的代码覆盖范围中排除 Program.cs [重复]

如何使编译器仅搜索包含目录中的特定文件并排除该特定目录中的其余文件[重复]