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


当前回答

非常有用,特别是对于那些处理Node.js时,我们希望避免在“node_modules”中搜索:

find ./ -not -path "*/node_modules/*" -name "*.js" | xargs grep keyword

其他回答

如果要排除多个目录:

"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}中的逗号后面添加空格

经常使用这个:

Grep可以与-r(递归),I(忽略大小写)和-o(只打印匹配的部分行)一起使用。要排除文件使用——exclude,要排除目录使用——exclude-dir。

把它们放在一起,你会得到这样的结果:

grep -rio --exclude={filenames comma separated} \
--exclude-dir={directory names comma separated} <search term> <location>

描述它让它听起来比实际复杂得多。用一个简单的例子来说明比较容易。

例子:

假设我在当前项目中搜索在调试会话期间显式设置字符串值调试器的所有位置,现在希望检查/删除。

我编写了一个名为findDebugger.sh的脚本,并使用grep查找所有事件。然而:

对于文件排除-我希望确保.eslintrc被忽略(这实际上有一个关于调试器的检测规则,所以应该被排除)。同样,我不希望在任何结果中引用我自己的脚本。

对于目录排除——我希望排除node_modules,因为它包含许多做引用调试器的库,我对这些结果不感兴趣。此外,我只是希望省略。idea和。git隐藏目录,因为我也不关心这些搜索位置,并希望保持搜索性能。

所以这是结果-我创建了一个名为findDebugger.sh的脚本:

#!/usr/bin/env bash
grep -rio --exclude={.eslintrc,findDebugger.sh} \
--exclude-dir={node_modules,.idea,.git} debugger .

你可以试试grep -R搜索。| grep -v '^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(编辑:或银色搜索者),并完成它!

非常有用,特别是对于那些处理Node.js时,我们希望避免在“node_modules”中搜索:

find ./ -not -path "*/node_modules/*" -name "*.js" | xargs grep keyword