递归 grep:排除特定目录

gab*_*bor 52 linux grep command-line

我经常使用递归 grep 来查找具有特定内容的源文件。

grep -Rni "myfunc" .
Run Code Online (Sandbox Code Playgroud)

在大型代码库上,这可能会变慢,所以我使用 --incldue 来限制/白名单扩展。

grep -Rni --include=*.java "myfunc" .
Run Code Online (Sandbox Code Playgroud)

但是,排除(修剪)整个子目录会更有效,我在想:

grep -Rni --exclude=/.svn/ "myfunc" .
Run Code Online (Sandbox Code Playgroud)

但是 --exclude 只支持像上面的 *.java 这样的文件模式。如何排除目录?

小智 67

grep -r --exclude-dir=dev --exclude-dir=sys --exclude-dir=proc PATTERN data
Run Code Online (Sandbox Code Playgroud)

来源:https : //stackoverflow.com/questions/2799246/grep-exclusive-a-specific-folder-using

  • 请注意,这会递归地排除。`./dev` 将与 `./foo/bar/dev` 一起被排除在外。使用 `--exclude-dir=./dev` 仅适用于第一种情况。 (18认同)
  • 你也可以通过 globbing 来缩短它: ```bash grep -r --exclude-dir={dev,sys,proc} PATTERN data ``` globbing 的唯一问题是我不能让它在我的猛击。在这种情况下,我必须将它们分开。 (4认同)
  • 另请注意,{} 仅在您输入 1 个以上的条目时才有效,这意味着 --exclude-dir={home,.svn} 有效,但 --exclude-dir={.svn} 无效。弄清楚为什么 {} 不起作用是浪费我的时间,因为我首先测试了 1 个条目。 (3认同)

Ale*_*man 10

你可能会调查ack

我刚刚开始使用它,但它似乎很适合这个。

  • Ack 有点慢。您可以尝试 Silver Searcher (Ag) 或 ripgrep (rg)。 (2认同)

Jos*_*osh 6

您可以使用 find 代替:

find . -not -path "*/.svn*" -not -type d -exec grep -ni "myfunc" {} \; -print
Run Code Online (Sandbox Code Playgroud)

好的,这就有点倒退了,你先得到 grep 结果,然后是路径。也许其他人有更好的答案?

  • 好吧,我很喜欢。当然 find 更灵活。输出之间的唯一区别是“grep -Rni”将打印每个匹配的文件名,而“find -exec grep”将在一行上打印文件名,然后为每个匹配打印一行(带有行号和行内容) )。使用“grep -Hni”强制文件名显示在每一行 (3认同)