我如何从grep中排除目录

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


解决方案1(结合findgrep

此解决方案的目的不是为了处理grep性能,而是为了展示便携式解决方案:还应该使用busybox或2.5以前的GNU版本。

使用find ,排除foo和bar目录:

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

然后结合findgrep的非递归使用,作为一个便携式解决方案:

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列出的文件和目录,因此您不必为grepfind继续传递相同的繁琐排除选项。


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

--exclude-dir=dir

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

所以你可以这样做:

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

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

  • 文件和目录选择的GNU手册页
  • 相关的StackOverflow答案使用grep --exclude / - 包含语法不通过某些文件grep
  • 对于较老的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} 的逗号后面添加空格

    链接地址: http://www.djcxy.com/p/8291.html

    上一篇: How can I exclude directories from grep

    下一篇: How to grep Git commit diffs or contents for a certain word?