在find命令中对多种文件类型使用regex
我目前正在使用在find命令中对多种文件类型使用regex,regex,bash,file-extension,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。您可以使用布尔或参数: find .
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。您可以使用布尔或参数:
find . -name '*.[ch]' -o -name '*.[CH]' -o -name '*.cc' -o -name '*.CC'
上述操作将在当前目录和所有子目录中搜索以以下内容结尾的文件:
,.c
或.h
,.C
或.H
或.cc
.CC
查找-正则表达式“*\”([chCH]\\\\\\\\\\\\\)”
将查找名称以.c、.c、.h、.h、.cc和.cc结尾的所有文件,但找不到任何以.hc、.cc或.cc结尾的文件。在正则表达式中,名称中的前几个字符与最后一个句点匹配,括号中的可选字符与任何单个字符c、h、c或h匹配,或者与cc或cc匹配 注意,find的
-regex
和-iregex
开关类似于-name
和-iname
,但regex类型开关允许正则表达式使用|
进行替代匹配。与-iname
类似,-iregex
不区分大小写
(非功能性)表格find-名称“*[cCHh][cC]?$”
在前面的回答中没有列出我的linux系统上GNU find 4.4.2的任何名称。
*.[cCHh][cC]?$作为正则表达式的另一个问题是,它将匹配像abc.cC
和xyz.hc
这样的名称,这些名称不在所需的.c、.c、.h、.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})$'
顺便说一句,-name
的参数不是正则表达式,而是shell扩展。第一种形式不起作用,因为?
和$
不是shell模式,所以它们会被解释literally@rid,我编辑后指出,-iregex.*\.[ch]\\\\\.*.cc'
与.ch不匹配。但是,我同意它匹配.Cc和.Cc,并为精确的扩展集添加了一个“-regex”,这比尝试使用regex要优雅得多。如果您想添加“-exec”,这是行不通的。例如,“find-name*.log'-o-name*.txt-exec cat'{}\”,它只执行第一个名称,如果出于某种原因,您没有意识到它是-o
@OutputLogic,使用find
s优先级运算符(和)处理这个问题,例如find\(.name”*.log“-o-name”*.txt”\)-exec cat{}
应该意味着-exec
可以按预期工作。rid--您介意更新您的答案吗,这样普通读者就不会错过Briggs的观点了?