6

我目前正在使用

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

4 回答 4

16

您可以使用布尔 OR 参数:

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

以上在当前目录和所有子目录中搜索以以下结尾的文件:

  • .c,.h
  • .C,.H
  • .cc或者
  • .CC.
于 2012-10-19T07:47:50.427 回答
12

这应该工作

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 扩展名。你被警告了。

于 2012-10-19T08:02:26.327 回答
2

该命令有效。

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

我希望我可以使用iregex. iregex还会找到.Ccand .cC。如果可以,该命令将如下所示。只是短一点。

find -regextype posix-extended -iregex '.+\.(h|H|c{1,2})$'
于 2014-02-19T11:15:50.703 回答
0

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

请注意,find-regex-iregex开关类似于-nameand -iname,但正则表达式类型开关允许正则表达式 with|用于替代匹配。像-iname, -iregex不区分大小写。

先前答案中给出的(非功能性)形式
find . -name '*.[cCHh][cC]?$'
没有列出我的 linux 系统上的任何名称,其中包含 GNU find 4.4.2。作为正则表达式的另一个问题'*.[cCHh][cC]?$'是它会匹配您想要的 .c、.C、.h、.H、.ccabc.Ccxyz.hc.CC 文件集中的名称。

于 2012-10-19T07:53:47.573 回答