--exclude-dir=dir
其中不包括目录模式匹配的dir
由递归目录搜索。
因此,您可以执行以下操作:
grep -R --exclude-dir=node_modules 'some pattern' /path/to/search
有关语法和用法的更多信息,请参见
对于较旧的 GNU Greps 和POSIX Grep ,请按照其他答案中的建议find
或者只是使用ack
(编辑:或Silver Searcher )并完成它!
解决方案 1(结合find
和grep
)
该解决方案的目的不是要处理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
列出的文件和目录,因此您不必始终将相同的繁琐排除选项传递给grep
或find
。
如果要排除多个目录:
“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}