如何从grep -R中排除目录?

时间:2011-07-03 20:48:43

标签: linux unix grep

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

14 个答案:

答案 0 :(得分:892)

GNU Grep的最新版本(> = 2.5.2)提供:

--exclude-dir=dir

从排名目录搜索中排除与模式dir匹配的目录。

所以你可以这样做:

grep -R --exclude-dir=node_modules 'some pattern' /path/to/search

有关语法和用法的更多信息,请参阅

对于较旧的GNU Grep和POSIX Grep,请按照其他答案中的建议使用find

或者只使用ack修改:或The Silver Searcher)并完成它!

答案 1 :(得分:240)

解决方案1(合并findgrep

此解决方案的目的不是处理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):

您已经知道这个解决方案,但我添加它,因为它是最新且最有效的解决方案。请注意,这是一种不太便于使用的解决方案,但更具人性化。

grep -R --exclude-dir=node_modules 'some pattern' /path/to/search

要排除多个目录,请使用--exclude-dir

--exclude-dir={node_modules,dir1,dir2,dir3}

解决方案3(Ag)

如果您经常搜索代码,Ag (The Silver Searcher)是一个比grep更快的替代品,它是为搜索代码而定制的。例如,它会自动忽略.gitignore中列出的文件和目录,因此您不必将同样繁琐的排除选项传递给grepfind

答案 2 :(得分:66)

如果要排除多个目录:

“r”表示递归,“l”只打印包含匹配项的文件名,“i”表示忽略大小写区别:


grep -rli --exclude-dir={dir1,dir2,dir3} keyword /path/to/search

示例:我想查找包含“hello”一词的文件。我想在我的所有linux目录中搜索 proc 目录,启动目录, sys 目录和 root 目录:


grep -rli --exclude-dir={proc,boot,root,sys} hello /

注意:上面的例子需要是root

注2(根据@skplunkerin):不要在 {dir1,dir2,dir3}

中的逗号后添加空格

答案 3 :(得分:33)

此语法

--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等目录。

答案 4 :(得分:13)

经常使用:

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 :(得分:8)

您可以尝试grep -R search . | grep -v '^node_modules/.*'

之类的内容

答案 6 :(得分:5)

如果要在git存储库中获取代码,并且node_modules.gitignore中,则可以使用git grepgit grep在工作树中搜索跟踪的文件,而忽略了.gitignore

中的所有内容
git grep "STUFF"

答案 7 :(得分:4)

非常有用,特别是那些处理Node.js的人,我们希望避免在“node_modules”中搜索:

find ./ -not -path "*/node_modules/*" -name "*.js" | xargs grep keyword

答案 8 :(得分:2)

一个简单的工作命令:

root/dspace# grep -r --exclude-dir={log,assetstore} "creativecommons.org"

上面我grep for text&#34; creativecommons.org&#34;在当前目录&#34; dspace&#34;并排除dirs {log,assetstore}。

完成。

答案 9 :(得分:2)

这个对我有用

grep <stuff> -R --exclude-dir=<your_dir>

答案 10 :(得分:1)

find . ! -name "node_modules" -type d 

答案 11 :(得分:0)

更简单的方法是使用“grep -v”过滤结果。

grep -i needle -R * | grep -v node_modules

答案 12 :(得分:0)

这里给出了许多正确答案,但是我要补充这一点,以强调一个要点,该原因导致一些匆忙的尝试失败了: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中多余的尾部斜杠。

答案 13 :(得分:0)

第 1 步:

vim ~/.bash_profile

search() {
    grep -InH -r --exclude-dir=*build*  -e "$1" .
}

第 2 步:

source ~/.bash_profile

用法:

search "<string_to_be_searched>"