我如何从grep中排除目录
我想遍历除“node_modules”目录外的所有子目录。
解决方案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
):
你已经知道这个解决方案了,但是我增加了它,因为它是最新的高效解决方案。 请注意,这是一种不易携带的解决方案,但更易于阅读。
grep -R --exclude-dir=node_modules 'some pattern' /path/to/search
溶液3(Ag)
如果您经常搜索代码,Ag(The Silver Searcher)是grep更快的替代方案,它是为搜索代码而定制的。 例如,它会自动忽略.gitignore
列出的文件和目录,因此您不必为grep
或find
继续传递相同的繁琐排除选项。
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
( 编辑 :或银色搜索者 )并完成它!
如果你想排除多个目录:
“r”用于递归,“l”用于仅打印包含匹配的文件的名称,用“i”来忽略大小写区别:
grep -rli --exclude-dir={dir1,dir2,dir3} keyword /path/to/search
例如:我想查找包含单词“hello”的文件。 我想搜索除 proc目录, boot目录, sys目录和根目录以外的所有linux目录:
grep -rli --exclude-dir={proc,boot,root,sys} hello /
注意:上面的示例需要是root用户
注2(根据@skplunkerin):不要在 {dir1,dir2,dir3}
的逗号后面添加空格
上一篇: How can I exclude directories from grep
下一篇: How to grep Git commit diffs or contents for a certain word?