我想遍历所有子目录,除了“node_modules”目录。


当前回答

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

--exclude-dir=dir

从递归目录搜索中排除匹配模式dir的目录。

所以你可以这样做:

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

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

文件和目录选择的GNU手册页 使用grep——exclude/——include语法在某些文件中不使用grep

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

或者只是使用ack(编辑:或银色搜索者),并完成它!

其他回答

步骤1:

vim ~ / . bash_profile

search() {
    grep -InH -r --exclude-dir=*build*  -e "$1" .
}

步骤2:

源~ / . bash_profile

用法:

搜索”< string_to_be_searched >”

find . ! -name "node_modules" -type d 

解决方案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 as:

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

方案3(银)

如果你经常在代码中搜索,Ag(银色搜索器)是一个比grep更快的替代品,它是为搜索代码而定制的。例如,它会自动忽略.gitignore中列出的文件和目录,因此您不必一直向grep或find传递同样麻烦的排除选项。

如果你在git存储库中grep代码,而node_modules在你的.gitignore中,你可以使用git grep。Git grep在工作树中搜索被跟踪的文件,忽略来自.gitignore的所有文件

git grep "STUFF"

如果要排除多个目录:

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

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

示例:我想找到包含单词“hello”的文件。我想搜索所有的linux目录,除了proc目录,boot目录,sys目录和根目录:

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

注意:上面的示例需要是root

注2(根据@skplunkerin):不要在{dir1,dir2,dir3}中的逗号后面添加空格