这个问题与其他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'
有效
答案 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|mst|pif|scr|sct|shb|sys|vb|vbe|vbs|vxd|wsc|wsf|wsh)'
启用-E参数使用--extended-regex
。
答案 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)