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

Ste*_* L. 36 grep regular-expression

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

我正在使用以下命令:

grep -inRw -E 'direct' . --exclude-dir -E 'git|log|asset'
Run Code Online (Sandbox Code Playgroud)

这个命令没有做我认为它会做的事情。这是我认为它会起作用的方式:

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

在排除目录方面,该命令最终仍会在“./git”“./log”目录以及“./app/assets”中搜索

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

don*_*sti 42

该选项的手册页描述有点误导......它是globs 中的模式而不是regex 中的模式。按照info页面

--exclude-dir=GLOB

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

因此,在您的情况下,您可以运行:

grep -inRw -E 'direct' . --exclude-dir={git,log,assets}
Run Code Online (Sandbox Code Playgroud)

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

grep -inRw -E 'direct' . --exclude-dir={\*git,asset\*}
Run Code Online (Sandbox Code Playgroud)

排除gitasset.结尾或开头的目录名称。

  • 好的 - 我现在看到问题了。这必须是仅限 Apple 系统使用的 grep 的修改版本。我在 Mac OS X 上。我很抱歉这里的混乱。我确定在 stackexchange 的其他地方有一个论坛我可以发帖。 (2认同)

Joh*_*024 13

--exclude-dir不明白|

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

grep -inRw -E --exclude-dir 'asset' --exclude-dir 'git' --exclude-dir 'log' 'direct'
Run Code Online (Sandbox Code Playgroud)


Jit*_*ran 11

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

以下作品:

grep -r --exclude-dir={cache,lib} pattern /home/ /var/
Run Code Online (Sandbox Code Playgroud)

以下不起作用:

grep -r --exclude-dir={/var/cache,/var/lib} pattern /home/ /var/
Run Code Online (Sandbox Code Playgroud)