我想遍历所有子目录,但“node_modules”目录除外。
#1楼
一种更简单的方法是使用“grep -v”过滤结果。
grep -i needle -R * | grep -v node_modules
#2楼
非常有用,特别是对于那些我们想要避免在“node_modules”内搜索的Node.js的人 :
find ./ -not -path "*/node_modules/*" -name "*.js" | xargs grep keyword
#3楼
如果要排除多个目录:
“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}
的逗号后添加空格
#4楼
经常使用这个:
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 .
#5楼
一个简单的工作命令:
root/dspace# grep -r --exclude-dir={log,assetstore} "creativecommons.org"
上面我在当前目录“dspace”中找到文本“creativecommons.org”并排除dirs {log,assetstore}。
完成。
#6楼
这个对我有用
grep <stuff> -R --exclude-dir=<your_dir>
#7楼
这个语法
--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??'}
模式可以跨越多个路径段:
--exclude-dir='some*/?lse'
这将排除像topdir/something/else
这样的topdir/something/else
。
#8楼
如果您正在使用git存储库中的代码,而node_modules
位于.gitignore
,则可以使用git grep
。 git grep
搜索工作树中的跟踪文件,忽略.gitignore
所有内容
git grep "STUFF"
#9楼
这里给出了许多正确的答案,但是我正在添加这一点以强调一点,这导致一些匆忙的尝试失败: exclude-dir
采用模式 ,而不是目录的路径。
说你的搜索是:
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中的任何冗余尾部斜杠。
#10楼
你可以尝试类似grep -R search . | grep -v '^node_modules/.*'
东西grep -R search . | grep -v '^node_modules/.*'
grep -R search . | grep -v '^node_modules/.*'
#11楼
解决方案1(结合find
和grep
)
此解决方案的目的不是处理grep
性能而是显示可移植解决方案:还应该使用busybox或早于2.5的GNU版本。
使用find
find /dir \( -name foo -prune \) -o \( -name bar -prune \) -o -name "*.sh" -print
然后结合使用grep
find
和非递归使用,作为便携式解决方案:
find /dir \( -name node_modules -prune \) -o -name "*.sh" -exec grep --color -Hn "your text to find" {} 2>/dev/null \;
解决方案2(递归使用grep
):
您已经知道了这个解决方案,但我添加它,因为它是最新且最有效的解决方案。 请注意,这是一种不太便携的解决方案,但更具人性化。
grep -R --exclude-dir=node_modules 'some pattern' /path/to/search
要排除多个目录,请使用--exclude-dir
as:
--exclude-dir={node_modules,dir1,dir2,dir3}
解决方案3(Ag)
如果你经常搜索代码, Ag(The Silver Searcher)是一个比grep更快的替代品,它是为搜索代码而定制的。 例如,它会自动忽略.gitignore
列出的文件和目录,因此您不必继续将相同的繁琐排除选项传递给grep
或find
。
#12楼
find . ! -name "node_modules" -type d
#13楼
最新版本的GNU Grep (> = 2.5.2 )提供:
--exclude-dir=dir
不包括目录模式匹配的dir
由递归目录搜索。
所以你可以这样做:
grep -R --exclude-dir=node_modules 'some pattern' /path/to/search
有关语法和用法的更多信息,请参阅
- 文件和目录选择的GNU手册页
- 相关的StackOverflow答案使用grep --exclude / - include语法不要浏览某些文件
对于较旧的GNU Greps和POSIX Grep ,请按照其他答案中的建议使用find
。
或者只使用ack ( 编辑 :或银色搜索者 )并完成它!