关于正则表达式:如何递归地grep多个可能的扩展

How do I grep multiple possible extensions recursively

此问题与其他grep模式匹配问题不同,因为我们正在寻找大量的文件扩展名,因此此问题中的以下内容将太长且繁琐,无法键入:grep -r -i --include '*.ade' --include '*.adp' ... CP_Image ~/path[12345]

当谷歌出于安全原因阻止我上传附件时,我正试图通过电子邮件发送一个静态站点的备份。他们的支持页面显示:

You can't send or receive the following file types:

.ade, .adp, .bat, .chm, .cmd, .com, .cpl, .exe, .hta, .ins, .isp, .jar, .jse, .lib, .lnk, .mde, .msc, .msp, .mst, .pif, .scr, .sct, .shb, .sys, .vb, .vbe, .vbs, .vxd, .wsc, .wsf, .wsh

我在这里转换并测试了以下正则表达式:

1
/.*\.(ade|adp|bat|chm|cmd|com|cpl|exe|hta|ins|isp|jar|jse|lib|lnk|mde|msc|msp|mst|pif|scr|sct|shb|sys|vb|vbe|vbs|vxd|wsc|wsf|wsh)/gi

并尝试用以下方式运行:

1
ls -lahR | grep '.*\.(ade|adp|bat|chm|cmd|com|cpl|exe|hta|ins|isp|jar|jse|lib|lnk|mde|msc|msp|mst|pif|scr|sct|shb|sys|vb|vbe|vbs|vxd|wsc|wsf|wsh)'

它不起作用。我不认为grep正确地解释and(|符号,因为ls -lahR | grep '.*\.html'起作用。


普通grep使用基本正则表达式(bre)。在BRE中,捕获组由\(...\)表示,交替操作由\|表示。

1
grep '.*\.\(ade\|adp\|bat\|chm\|cmd\|com\|cpl\|exe\|hta\|ins\|isp\|jar\|jse\|lib\|lnk\|mde\|msc\|msp\|mst\|pif\|scr\|sct\|shb\|sys\|vb\|vbe\|vbs\|vxd\|wsc\|wsf\|wsh\)'

1
grep -E '.*\.(ade|adp|bat|chm|cmd|com|cpl|exe|hta|ins|isp|jar|jse|lib|lnk|mde|msc|msp|ms??t|pif|scr|sct|shb|sys|vb|vbe|vbs|vxd|wsc|wsf|wsh)'

通过启用-e参数来使用--extended-regex

参考文献


添加标志-E表示它是扩展正则表达式。来自GNUgrep2.1:默认为"基本正则表达式",并且

[i]n basic regular expressions the meta-characters ‘?’, ‘+’, ‘{’, ‘|’, ‘(’, and ‘)’ lose their special meaning.


排除给定扩展的bash方法:使用扩展的globbing

1
2
shopt -s extglob nullglob
ls *.!(ade|adp|bat|chm|cmd|com|cpl|exe|hta|ins|isp|jar|jse|lib|lnk|mde|msc|msp|mst|pif|scr|sct|shb|sys|vb|vbe|vbs|vxd|wsc|wsf|wsh)

I'm recursively trying to find files with the specified extensions.

最好使用find-iregex选项:

1
find . -regextype posix-egrep -iregex '.*\.(ade|adp|bat|chm|cmd|com|cpl|exe|hta|ins|isp|jar|jse|lib|lnk|mde|msc|msp|mst|pif|scr|sct|shb|sys|vb|vbe|vbs|vxd|wsc|wsf|wsh)'

关于OSX的使用:

1
find -E . posix-egrep -iregex '.*\.(ade|adp|bat|chm|cmd|com|cpl|exe|hta|ins|isp|jar|jse|lib|lnk|mde|msc|msp|mst|pif|scr|sct|shb|sys|vb|vbe|vbs|vxd|wsc|wsf|wsh)'