如何在“grep -R”中排除匹配全局模式的多个目录?

26

我在当前目录下有一些名为“mm-yyyy”(例如01-2014)的目录。我想要在名称中包含“2013”的目录中查找文件。如何排除名称中不包含“2013”的目录?我尝试了以下方法,但不起作用:

grep hill * -R --exclude-dir=*201[0-2]

它仍会遍历所有子目录以执行grep命令。

2个回答

55
grep -r --exclude-dir={dir1,dir2,dir3} string_to_search_for *

当涉及到目录时,如果没有简单的正则表达式可用,则此方法非常有用。 - OrangePeel52
7
这里没有使用正则表达式技巧。Bash大括号扩展用于节省重复输入参数。以上命令的解释为 grep -r --exclude-dir=dir1 --exclude-dir=dir2 --exclude-dir=dir3 string_to_search_for *。欲了解更多Bash技巧,可参考(http://wiki.bash-hackers.org/syntax/expansion/brace)。 - Amin Mozafari

21

你可以使用

grep -R hill *-2013

--exclude-dir 也应该可以起作用:

grep -R hill --exclude-dir=".*201[0-2]" .

如果没有引号,星号将被Bash扩展。 正则表达式的通配符是.*

. - matches any character
* - match any number of repetitions of the previous character, including none

谢谢,Max。它有效。但我想知道是否可以使用--exclude-dir实现相同的效果。 - user1628175
我已经编辑了我的答案,包括使用“--exclude-dir”选项的解决方案。 - Max Fichtelmann
我尝试了exclude-dir,但它没有起任何作用。没有输出。它只是静静地坐在那里等待更多的用户输入。所以我在“hill”后面添加了*,但它并不起作用。 - user1628175
啊,好的,使用“.”代替“*.*”可以指定所有目录,而排除模式会在这些目录中触发——即你不想要的内容。 - Max Fichtelmann
点号是有效的。但是,“201[02]”只会排除包含“2010”和“2012”的目录。如果要排除包含“2010”,“2011”和“2012”的目录,我必须使用这个:“201[012]”。请更新答案,以便我可以标记它为已接受。 - user1628175
注意grep版本,因为--exclude-dir是在2.5.3中引入的。(在旧的CentOS 5.11上不存在,grep版本为2.5.1)。 - Paolo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接