如何递归地grep多个可能的扩展

时间:2015-05-25 09:11:08

标签: regex grep

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

出于安全原因,当Google阻止我的附件上传时,我试图通过电子邮件发送静态网站的备份。他们的support page says

  

您无法发送或接收以下文件类型:

     

.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

我转换并测试了以下正则表达式here

/.*\.(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

尝试用以下方式运行它:

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正确解释和(|)符号,因为ls -lahR | grep '.*\.html'有效

4 个答案:

答案 0 :(得分:2)

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

引用
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 -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

Reference

答案 1 :(得分:1)

添加标记-E以指示它是扩展的正则表达式。来自GNU Grep 2.1:默认为“基本正则表达式”和

  

[i] n基本正则表达式元字符'?','+','{','|','('和')'失去了它们的特殊含义。

答案 2 :(得分:0)

  

我以递归方式尝试查找具有指定扩展名的文件。

最好将find-iregex选项一起使用:

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上使用:

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)'

答案 3 :(得分:0)

用于排除指定扩展名的bash方法:使用extended globbing

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)