在find命令中使用regex用于多种文件类型

时间:2012-10-19 07:35:12

标签: regex bash file-extension

我目前正在使用

find . -name '*.[cCHh][cC]' -exec grep -nHr "$1" {} ; \
find . -name '*.[cCHh]' -exec grep -nHr "$1" {} ;

在所有子目录中列出的所有以.c,.C,.h,.H,.cc和.CC结尾的文件中搜索字符串。但由于这包括两个命令,因此效率低下。

如何使用单个正则表达式模式查找.c,.C,.h,.H,.cc和.CC文件?

我在Linux机器上使用bash。

4 个答案:

答案 0 :(得分:15)

您可以使用布尔OR参数:

find -name '*.[ch]' -o -name '*.[CH]' -o -name '*.cc' -o -name '*.CC'

以上查找以:

结尾的文件
  • .c.h
  • .C.H
  • .cc
  • .CC

答案 1 :(得分:11)

这应该有效

<强>凌乱

find . -iregex '.*\.\(c\|cc\|h\)' -exec grep -nHr "$1" {} +

-iregex用于不区分大小写的正则表达式模式。

(c|cc|h)(令人讨厌的转义未显示)与c,cc或h扩展名匹配


<强>清洁

find -regextype "posix-extended" -iregex '.*\.(c|cc|h)' -exec grep -nHr "$1" {} +

这也会找到.Cc和.cC扩展名。你被警告了。

答案 2 :(得分:2)

此命令有效。

find -regextype posix-extended -regex '.+\.(h|H|c{1,2}|C{1,2})$'

我希望我可以使用iregexiregex也会找到.Cc.cC。如果可以的话,命令看起来像这样。稍微短一些。

find -regextype posix-extended -iregex '.+\.(h|H|c{1,2})$'

答案 3 :(得分:0)

find . -regex '.*\.\([chCH]\|cc\|CC\)'
将找到名称以.c,.C,.h,.H,.cc和.CC结尾的所有文件,并且在.hc,.cC或.Cc中找不到任何结尾的文件。在正则表达式中,前几个字符匹配名称中的最后一个句点,括号中的替代字符匹配任何单个字符c,h,C或H,或cc或CC中的任何一个。

注意,查找的-regex-iregex开关类似于-name-iname,但正则表达式类型的开关允许使用|的正则表达式替代火柴。与-iname一样,-iregex不区分大小写。

(非功能)形式
find . -name '*.[cCHh][cC]?$'
在上一个答案中给出的并没有列出我的linux系统上使用GNU find 4.4.2的任何名称。 '*.[cCHh][cC]?$'作为正则表达式的另一个问题是它会匹配abc.Ccxyz.hc之类的名称,这些名称不在.c,.C,.h,.H,.cc的集合中和.CC文件你想要的。