我目前正在使用
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。
答案 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})$'
我希望我可以使用iregex
。 iregex
也会找到.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.Cc
和xyz.hc
之类的名称,这些名称不在.c,.C,.h,.H,.cc的集合中和.CC文件你想要的。