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


当前回答

经常使用这个:

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 .

其他回答

这个语法

--exclude-dir={dir1,dir2}

被shell(例如Bash)而不是grep扩展为:

--exclude-dir=dir1 --exclude-dir=dir2

引用将阻止shell扩展它,所以这将不起作用:

--exclude-dir='{dir1,dir2}'    <-- this won't work

与——exclude-dir一起使用的模式与——exclude选项手册页中描述的模式相同:

--exclude=GLOB
    Skip files whose base name matches GLOB (using wildcard matching).
    A file-name glob can use *, ?, and [...]  as wildcards, and \ to
    quote a wildcard or backslash character literally.

shell通常会尝试自己展开这样的模式,所以为了避免这种情况,你应该引用它:

--exclude-dir='dir?'

你可以像这样一起使用大括号和引号排除模式:

--exclude-dir={'dir?','dir??'}

最新版本的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(编辑:或银色搜索者),并完成它!

这里已经给出了许多正确答案,但我添加这个答案是为了强调一个问题,这个问题之前导致了一些匆忙的尝试失败:exclude-dir采用模式,而不是目录的路径。

假设你的搜索是:

grep -r myobject

您会注意到,您的输出与src/other/objects-文件夹的结果混杂在一起。这个命令不会给你预期的结果:

grep -r myobject --exclude-dir=src/other/objects-folder

您可能想知道为什么exclude-dir不起作用!要从objects文件夹中排除结果,只需这样做:

grep -r myobject --exclude-dir=objects-folder

换句话说,只需使用文件夹名,而不是路径。一旦你知道了,这是显而易见的。

从手册页:

——exclude-dir =水珠 跳过任何名称后缀与模式GLOB匹配的命令行目录。当 递归搜索,跳过基名与GLOB匹配的任何子目录。忽略任何 GLOB中多余的尾随斜杠。

find . ! -name "node_modules" -type d 

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

git grep "STUFF"