使用带有 --exclude-dir 标志的 grep 来排除多个目录

使用带有 --exclude-dir 标志的 grep 来排除多个目录

我正在 Ruby on Rails 应用程序中搜索 OSX 上使用的单词grep,并且我想排除与特定模式匹配的目录。

我正在使用以下命令:

grep -inRw -E 'direct' . --exclude-dir -E 'git|log|asset'

该命令没有执行我想象的操作。我是这样的想法它会起作用:

  • - 不区分大小写的搜索
  • n- 打印找到模式的行号
  • - 递归搜索
  • w- 我只想要整个单词 - 即匹配“direct”但不匹配“directory”
  • -E- 使用扩展正则表达式
  • '直接的'- 我要匹配的正则表达式
  • - 在当前目录中搜索
  • --exclude-dir -E 'git|log|asset'- 排除与 git 或 log 或 asset 匹配的目录。

就排除目录而言,该命令最终仍然在'./git''。/日志'目录以及'./应用程序/资产'

我显然缺乏一项基本知识,但我不知道它是什么。

答案1

它的模式如下球体不是像这样的模式正则表达式。根据info:

--排除-dir=GLOB

跳过名称后缀与模式 GLOB 匹配的任何命令行目录。递归搜索时,跳过基本名称与 GLOB 匹配的任何子目录。忽略 GLOB 中任何多余的尾部斜杠。

所以,您要么多次使用该开关或者,如果您的 shell 支持大括号扩展,您可以将其缩短并让 shell 扩展模式列表,例如:

grep -inRw -E 'direct' . --exclude-dir={git,log,assets}

排除名为git,logassets或 例如的目录

grep -inRw -E 'direct' . --exclude-dir={\*git,asset\*}

排除git以 . 结尾或开头的目录名称asset

请注意,只有当存在时,shell 才会展开列表大括号内至少有两个目录名/全局变量

答案2

--exclude-dir不明白|

但是,您可以通过指定多次来获得相同的效果--exclude-dir,每个要排除的目录一次:

grep -inRw -E --exclude-dir 'asset' --exclude-dir 'git' --exclude-dir 'log' 'direct'

答案3

这就是我做错的事情:输入的--exclude-dir是目录名而不是路径名。目录名称不能包含/.

以下作品:

grep -r --exclude-dir={cache,lib} pattern /home/ /var/

以下不起作用:

grep -r --exclude-dir={/var/cache,/var/lib} pattern /home/ /var/

答案4

请使用这个:

grep -inRw -E 'direct' folder/ --exclude-dir={\*git\*,\*log\*,\*assets\*}

或当前文件夹

grep -inRw -E 'direct' . --exclude-dir -E 'git|log|asset'

相关内容