协慌网

登录 贡献 社区

如何从 grep -R 中排除目录?

我想遍历除 “node_modules” 目录以外的所有子目录。

答案

最新版本的GNU Grep (> = 2.5.2 )提供:

--exclude-dir=dir

其中不包括目录模式匹配的dir由递归目录搜索。

因此,您可以执行以下操作:

grep -R --exclude-dir=node_modules 'some pattern' /path/to/search

有关语法和用法的更多信息,请参见

对于较旧的 GNU Greps 和POSIX Grep ,请按照其他答案中的建议find

或者只是使用ack编辑:或Silver Searcher )并完成它!

解决方案 1(结合findgrep

该解决方案的目的不是要处理grep性能,而是要显示一个可移植的解决方案:还应该与 busybox 或 2.5 之前的 GNU 版本一起使用。

使用find排除目录 foo 和 bar:

find /dir \( -name foo -prune \) -o \( -name bar -prune \) -o -name "*.sh" -print

然后将find grep的非递归使用相结合,作为可移植的解决方案:

find /dir \( -name node_modules -prune \) -o -name "*.sh" -exec grep --color -Hn "your text to find" {} 2>/dev/null \;

解决方案 2(使用grep --exclude-dir选项):

您已经知道此解决方案,但是我添加了它,因为它是最新,最有效的解决方案。请注意,这是一种不易移植的解决方案,但更易于理解。

grep -R --exclude-dir=node_modules 'some pattern' /path/to/search

要排除多个目录,请使用--exclude-dir作为:

--exclude-dir={node_modules,dir1,dir2,dir3}

解决方案 3(Ag)

如果您经常搜索代码,那么Ag(白银搜索器)是 grep 的一种更快的替代方法,它是为搜索代码而定制的。例如,它会自动忽略.gitignore列出的文件和目录,因此您不必始终将相同的繁琐排除选项传递给grepfind

如果要排除多个目录

“r” 表示递归,“l” 仅打印包含匹配项的文件名,“i” 忽略大小写区别:

grep -rli --exclude-dir={dir1,dir2,dir3} keyword /path/to/search

示例:我想查找包含单词 “hello” 的文件。我想搜索除 proc目录,引导目录, sys目录和目录之外的所有 linux 目录:

grep -rli --exclude-dir={proc,boot,root,sys} hello /

注意:上面的示例必须是 root

注释 2(根据 @skplunkerin):不要在{dir1,dir2,dir3}