【发布时间】:2010-12-02 06:25:29
【问题描述】:
当我 grep 我的 Subversion 工作副本目录时,结果包括很多来自 .svn 目录的文件。是否可以递归 grep 目录,但排除 .svn 目录中的所有结果?
【问题讨论】:
当我 grep 我的 Subversion 工作副本目录时,结果包括很多来自 .svn 目录的文件。是否可以递归 grep 目录,但排除 .svn 目录中的所有结果?
【问题讨论】:
如果您使用ack(“更好的 grep”),它会自动处理这个问题(并且还会做很多其他聪明的事情!)。非常值得一试。
【讨论】:
.stack-workdir),我也不太喜欢它的输出通过将文件名放在单独的行上来占用更多空间。所以我最终给 grep alias grepexclhid="grep --exclude-dir=\".*\"" 起了一个别名。
如果你有 GNU Grep,它应该像这样工作:
grep --exclude-dir=".svn"
如果碰巧在没有 GNU Grep 的 Unix 系统上,请尝试以下操作:
grep -R "whatever you like" *|grep -v "\.svn/*"
【讨论】:
--exclude-dir=\.svn
export GREP_OPTIONS="--exclude-dir=\".svn\" -nR --color" 的 GNU grep 2.6.3 不起作用
alias grepsvn='grep --exclude-dir=".svn"' grepsvn -R searchstring .
我认为递归的 --exclude 选项是您正在搜索的内容。
【讨论】:
--exclude 仅匹配文件模式,例如 *.java
grep --exclude-dir=".svn"
之所以有效,是因为“.svn”这个名字相当独特。但这可能会在更通用的名称上失败。
grep --exclude-dir="work"
不是防弹的,如果你有“/home/user/work”和“/home/user/stuff/work”,它会跳过这两个。无法定义“/*/work/*” 将排除限制为仅以前的文件夹名称。 据我所知,在 GNU grep 中,简单的 --exclude 不会排除目录。
【讨论】:
两个 grep 就可以解决问题:
第二个 grep 将使用第一个 grep 的输出作为输入(通过管道)。通过使用 -v 标志,grep 将选择与搜索词不匹配的行。瞧。剩下的是第一个 grep 的所有输出,文件路径中不包含 .svn。
-v, --invert-match 反转匹配感,选择不匹配的行。
grep the_text_you_want_to_search_for * | grep -v .svn【讨论】:
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 函数来代替。 或者,你可以等我这样的疯子发到网上:
【讨论】:
对于 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'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'
【讨论】:
对于 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 ./
【讨论】:
另一种选择,尽管可能不被视为可接受的答案是将 repo 克隆到 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/ 的行更好的解决方案,因为它不会意外过滤掉真实文件中的这些行。
【讨论】:
--exclude-dir 不是--exclude-dirs?