我想遍历所有子目录,除了“node_modules”目录。
当前回答
解决方案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传递同样麻烦的排除选项。
其他回答
这个语法
--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(编辑:或银色搜索者),并完成它!
find . ! -name "node_modules" -type d
经常使用这个:
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 .
一个简单的工作命令:
root/dspace# grep -r --exclude-dir={log,assetstore} "creativecommons.org"
上面我grep文本“creativecommons.org”在当前目录“dspace”和排除dirs{日志,资产存储}。
完成了。