我想遍历所有子目录,除了“node_modules”目录。
你可以尝试像grep -R search . | grep -v '^node_modules/.*'这样的东西
grep -R search . | grep -v '^node_modules/.*'
解决方案1(组合find和grep)
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选项):
--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。
.gitignore
find . ! -name "node_modules" -type d
GNU Grep(>=2.5.2)的最新版本提供:
--exclude-dir=dir
这将匹配模式dir的目录排除在递归目录搜索之外。
dir
所以你可以这样做:
有关语法和用法的更多信息,请参阅
对于较旧的GNU Greps和POSIX Grep,请按照其他答案中的建议使用find。
或者使用#0(编辑:或《寻银者》The Silver Searcher)并完成它!
更简单的方法是使用“grep-v”过滤结果。
grep -i needle -R * | grep -v 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目录和root目录:
grep -rli --exclude-dir={proc,boot,root,sys} hello /
注意:上面的例子需要是root
注2(根据@sksubkerin):不要在中的逗号后添加空格{dir1,dir2,dir3}
{dir1,dir2,dir3}
经常使用这个:
grep可以与-r(递归)、i(忽略大小写)和-o(仅打印匹配的部分行)结合使用。要排除files,请使用--exclude,要排除目录,请使用--exclude-dir。
-r
i
-o
files
--exclude
把它放在一起,你最终会得到这样的结果:
grep -rio --exclude={filenames comma separated} \--exclude-dir={directory names comma separated} <search term> <location>
描述它使它听起来比实际复杂得多。用一个简单的例子来说明更容易。
示例:
假设我在调试会话期间显式设置字符串值debugger的所有位置搜索当前项目,现在希望查看/删除。
debugger
我编写了一个名为findDebugger.sh的脚本并使用grep来查找所有出现的事件。但是:
findDebugger.sh
对于文件排除-我希望确保忽略.eslintrc(这实际上有一个关于debugger的lint规则,因此应该被排除)。同样,我不希望在任何结果中引用我自己的脚本。
.eslintrc
对于目录排除-我希望排除node_modules,因为它包含大量引用debugger的库,我对这些结果不感兴趣。此外,我只想省略.idea和.git隐藏目录,因为我也不关心这些搜索位置,并希望保持搜索性能。
node_modules
.idea
.git
所以这是结果-我创建了一个名为findDebugger.sh的脚本:
#!/usr/bin/env bashgrep -rio --exclude={.eslintrc,findDebugger.sh} \--exclude-dir={node_modules,.idea,.git} debugger .
一个简单的工作命令:
root/dspace# grep -r --exclude-dir={log,assetstore} "creativecommons.org"
上面我grep为当前目录“dspace”中的文本“creativecommons.org”并排除dirs{log, assetstore}。
成交
这个对我有用:
grep <stuff> -R --exclude-dir=<your_dir>
这种语法
--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=GLOBSkip files whose base name matches GLOB (using wildcard matching).A file-name glob can use *, ?, and [...] as wildcards, and \ toquote 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
git grep "STUFF"
这里给出了许多正确的答案,但我添加这个是为了强调之前导致一些匆忙尝试失败的一点:exclude-dir采用模式,而不是目录的路径。
exclude-dir
假设您的搜索是:
grep -r myobject
您注意到您的输出中充斥着来自src/other/objects-folder的结果。此命令将没有为您提供预期的结果:
src/other/objects-folder
grep -r myobject --exclude-dir=src/other/objects-folder
你可能想知道为什么exclude-dir不起作用!要实际从objects-folder中排除结果,只需这样做:
objects-folder
grep -r myobject --exclude-dir=objects-folder
换句话说,只需使用文件夹名称,而不是路径。一旦你知道它,就很明显了。
从手册页:
--排除-dir=GLOB跳过任何名称后缀与模式GLOB匹配的命令行目录。当递归搜索,跳过基本名称与GLOB匹配的任何子目录。忽略任何GLOB中的冗余尾斜杠。
步骤1:
vim ~/.bash_profile
search() {grep -InH -r --exclude-dir=*build* -e "$1" .}
步骤2:
source ~/.bash_profile
用法:
search "<string_to_be_searched>"