我目前正在使用
find . -name '*.[cCHh][cC]' -exec grep -nHr "$1" {} ;
find . -name '*.[cCHh]' -exec grep -nHr "$1" {} ;
要在以 .c 结尾的所有文件中搜索字符串,.C, .h, .H、.cc 和 .CC 列在所有子目录中。但由于这包括两个命令,因此感觉效率低下。
如何使用单个正则表达式模式来查找 .c,。唰,唰,。H,.cc 和 .抄送文件?
我在 Linux 机器上使用 bash。
您可以使用布尔 OR 参数:
find . -name '*.[ch]' -o -name '*.[CH]' -o -name '*.cc' -o -name '*.CC'
上面的内容在当前目录和所有子目录中搜索以下列结尾的文件:
.c
,.h
或.C
、.H
或.cc
或.CC
.
这应该有效
混乱
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扩展名也是如此。你已经被警告了。
此命令有效。
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})$'
find . -regex '.*.([chCH]|cc|CC)'
将找到名称以.c结尾的所有文件。唰,唰,。H,.cc 和 .CC 并且找不到任何以 .hc、.cC 或 .cc 结尾的内容。 在正则表达式中,前几个字符与名称中的最后一个句点匹配,括号中的替代项匹配单个字符 c、h、C 或 H 中的任何一个,或者 cc 或 CC 中的任何一个。
请注意,find 的-regex
和-iregex
开关类似于-name
和-iname
,但正则表达式类型的开关允许带有|
的正则表达式进行替代匹配。 像-iname
一样,-iregex
不区分大小写。
find . -name '*.[cCHh][cC]?$'
先前答案中给出的(非功能性)形式
没有列出我的 Linux 系统上的任何名称,GNU find 4.4.2。'*.[cCHh][cC]?$'
作为正则表达式的另一个问题是,它将匹配不在 .c,集合中的abc.Cc
和xyz.hc
等名称。唰,唰,。H,.cc 和 .所需的抄送文件。