将grep与--exclude-dir标志一起使用以排除多个目录


16

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

我正在使用以下命令:

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

该命令没有按照我的预期去做。我认为这会起作用:

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

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

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

Answers:


16

该选项的手册页描述有点令人误解...它是glob中的模式,而不是regex中的模式。按照info页面

--exclude-dir = GLOB

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

因此,您可以运行:

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

排除命名的目录gitlogassets或如

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

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


很有意思。我想我应该查一下什么是球。
史蒂文·L。

抱歉,这些似乎都没有用。如果我说我正在使用以下版本的grep:grep(BSD grep)2.5.1-FreeBSD是否会有所帮助?
史蒂文·L.16年

我很困惑,因为我正在阅读bsd grep的手册(freebsd.org/cgi/man.cgi?query=grep&sektion=&n=1),并且没有提到--exclude-dir。嘘
史蒂文·L.16年

2
好的-我现在看到了问题。这只能是Apple系统使用的grep的修改版本。我使用的是Mac OSX。很抱歉给您带来混乱。我确定我可以在其他地方发布关于stackexchange的论坛。
史蒂文·L.16年

@ user245185您是使用BSD还是OSX?两者都是此处的主题,但是请编辑您的问题并告诉我们您使用的是什么操作系统。您发现的不同实现之间,标准工具的行为也有所不同。
terdon

8

--exclude-dir不懂|

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

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

它为我工作。我想排除主目录,但是它不适用于其他选项--exclude-dir={home}。我打字的时候就曾工作过--exclude-dir 'home'
Mubin Icyer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.