我想遍历所有子目录,除了“node_modules”目录。
node_modules
在您的 .gitignore
中,则 git grep "STUFF"
是最简单的方法。 git grep
在工作树中搜索跟踪的文件,忽略 .gitignore
中的所有内容
grep -R --exclude-dir={node_modules,bower_components} "MyString" | cut -c1-"$COLUMNS"
- 此外,您始终可以在 shell 中将其别名为“nodegrep”或其他任何内容,并使用命令参数作为字符串输入。
--exclude-dir=dir
从递归目录搜索中排除与模式 dir
匹配的目录。
所以你可以这样做:
grep -R --exclude-dir=node_modules 'some pattern' /path/to/search
有关语法和用法的更多信息,请参阅
文件和目录选择的 GNU 手册页
一个相关的 StackOverflow 答案使用 grep --exclude/--include 语法不通过某些文件 grep
对于较旧的 GNU Greps 和 POSIX Grep,请按照其他答案中的建议使用 find
。
或者只需使用 ack
(Edit: 或 The Silver Searcher)即可完成!
解决方案 1(结合 find
和 grep
)
此解决方案的目的不是处理 grep
性能,而是展示一个可移植的解决方案:也应该与 2.5 之前的 busybox 或 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
用作:
--exclude-dir={node_modules,dir1,dir2,dir3}
溶液 3(银)
如果您经常搜索代码,Ag (The Silver Searcher) 是 grep 更快的替代方法,它是为搜索代码而定制的。例如,它会自动忽略 .gitignore
中列出的文件和目录,因此您不必一直将相同的繁琐排除选项传递给 grep
或 find
。
--exclude-dir=dir
快,而且它用颜色显示结果 - 易于阅读
find ... -exec
对我来说并不比 grep --exclude-dir
快。 grep 的巨大优势(对于 26k+ 文件,大约快五倍,在 HDD 上过滤掉 38k+ 文件),除非您将 \;
替换为 +
用于查找/执行组合。然后 grep “只”快 30% 左右。 grep 语法也是人类可读的:)。
--exclude-dir={dir1,dir2}
排除多个
node_modules
是典型示例,我一点也不感到惊讶。
如果要排除多个目录:
“r”表示递归,“l”只打印包含匹配项的文件名,“i”表示忽略大小写区别:
grep -rli --exclude-dir={dir1,dir2,dir3} keyword /path/to/search
示例:我想查找包含单词“hello”的文件。我想搜索除 proc 目录、引导目录、sys 目录和根目录之外的所有 linux 目录:
grep -rli --exclude-dir={proc,boot,root,sys} hello /
注意:上面的例子需要root
注意 2(根据 @skplunkerin):不要在逗号后添加空格 {dir1,dir2,dir3}
{dir1,dir2,dir3}
中的逗号后添加空格
grep -Irsn --exclude-dir=.svn 'foo' .
--exclude-dir
选项。
这种语法
--exclude-dir={dir1,dir2}
由 shell(例如 Bash)而不是 grep
扩展为:
--exclude-dir=dir1 --exclude-dir=dir2
引用将阻止外壳扩展它,因此这不起作用:
--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??'}
如果您在 git 存储库中查找代码并且 node_modules
在您的 .gitignore
中,则可以使用 git grep
。 git grep
在工作树中搜索跟踪的文件,忽略来自 .gitignore
的所有内容
git grep "STUFF"
经常使用这个:
grep
可以与 -r
(递归)、i
(忽略大小写)和 -o
(仅打印匹配的部分行)结合使用。要排除 files
,请使用 --exclude
,要排除目录,请使用 --exclude-dir
。
把它放在一起,你最终会得到类似的东西:
grep -rio --exclude={filenames comma separated} \
--exclude-dir={directory names comma separated} <search term> <location>
描述它会使它听起来比实际上要复杂得多。用一个简单的例子更容易说明。
例子:
假设我正在为我在调试会话期间明确设置字符串值 debugger
的所有位置搜索当前项目,现在希望查看/删除。
我编写了一个名为 findDebugger.sh
的脚本并使用 grep
来查找所有匹配项。然而:
对于文件排除 - 我希望确保忽略 .eslintrc
(这实际上有一个关于 debugger
的 linting 规则,因此应该被排除)。同样,我不希望在任何结果中引用我自己的脚本。
对于目录排除 - 我希望排除 node_modules
,因为它包含许多引用 debugger
的库,我对这些结果不感兴趣。此外,我只想省略 .idea
和 .git
隐藏目录,因为我也不关心这些搜索位置,并希望保持搜索性能。
结果如下 - 我创建了一个名为 findDebugger.sh
的脚本:
#!/usr/bin/env bash
grep -rio --exclude={.eslintrc,findDebugger.sh} \
--exclude-dir={node_modules,.idea,.git} debugger .
这里已经给出了许多正确的答案,但我添加这个是为了强调之前导致一些匆忙尝试失败的一点:exclude-dir
采用 pattern,而不是目录的路径。
假设您的搜索是:
grep -r myobject
您注意到您的输出中充满了来自 src/other/objects-folder
的结果。此命令不会为您提供预期的结果:
grep -r myobject --exclude-dir=src/other/objects-folder
您可能想知道为什么 exclude-dir
不起作用!要实际从 objects-folder
中排除结果,只需执行以下操作:
grep -r myobject --exclude-dir=objects-folder
换句话说,只使用文件夹名称,而不是路径。一旦你知道它就很明显了。
从手册页:
--exclude-dir=GLOB 跳过名称后缀与模式 GLOB 匹配的任何命令行目录。递归搜索时,跳过基本名称与 GLOB 匹配的任何子目录。忽略 GLOB 中任何多余的尾部斜杠。
您可以尝试类似 grep -R search . | grep -v '^node_modules/.*'
/var
的 grep 在命中 /var/run
时会挂起。因此,我首先要避免使用该目录的原因。
--exclude-dir
是截至 2016 年的最佳解决方案。
非常有用,特别是对于那些处理我们希望避免在“node_modules”中搜索的Node.js:
find ./ -not -path "*/node_modules/*" -name "*.js" | xargs grep keyword
一个简单的工作命令:
root/dspace# grep -r --exclude-dir={log,assetstore} "creativecommons.org"
上面我在当前目录“dspace”中搜索文本“creativecommons.org”并排除目录{log,assetstore}。
完毕。
这个对我有用:
grep <stuff> -R --exclude-dir=<your_dir>
步骤1:
vim ~/.bash_profile
search() {
grep -InH -r --exclude-dir=*build* -e "$1" .
}
第2步:
source ~/.bash_profile
用法:
search "<string_to_be_searched>"
find . ! -name "node_modules" -type d
更简单的方法是使用“grep -v”过滤结果。
grep -i needle -R * | grep -v node_modules
不定期副业成功案例分享
ack
很棒,请尝试 The Silver Searcher 并查看速度提升!--exclude-dir=dir
使用grep
的正则表达式模式,not shell 的文件通配符。模式适用于相对于当前目录的路径。所以使用模式--exclude-dir=dir
,而不是--exclude-dir="/root/dir/*"
。$ grep -r --exclude-dir=dir1 --exclude-dir=dir2 "string" /path/to/search/dir
更好的选择?grep -r --exclude-dir=public keyword .
有效,但grep -r --exclude-dir='public/dist' keyword .
无效。我尝试添加正则表达式通配符、转义字符等,但似乎没有任何帮助。grep -r "Request" . --exclude-dir={node_modules,git,build}