如何让zsh大括号展开在匹配失败后继续执行?
解决zsh中rm通配符无匹配时命令失败的问题
zsh默认会在通配符(如*.jpg)未匹配到任何文件时直接报错,终止整个命令执行,导致其他存在的目标文件也无法被删除。以下是几种可行的解决办法:
方法1:临时启用nullglob选项
开启nullglob后,无匹配的通配符会被展开为空字符串,而非报错。执行完删除操作后建议恢复默认设置,避免影响其他命令:
setopt nullglob rm *.{jpg,jpeg,png,gif} setopt nonullglob
如果要精简成一行:
setopt nullglob; rm *.{jpg,jpeg,png,gif}; setopt nonullglob
如果担心所有通配符都无匹配导致rm因缺少参数报错,可以加个判断逻辑:
setopt nullglob target_files=(*.{jpg,jpeg,png,gif}) if (( $#target_files > 0 )); then rm "$target_files[@]" fi setopt nonullglob
方法2:使用find命令(跨shell通用)
如果不想修改shell选项,find命令可以更灵活地筛选并删除文件,且不会因无匹配报错:
find . -maxdepth 1 -type f \( -name "*.jpg" -o -name "*.jpeg" -o -name "*.png" -o -name "*.gif" \) -exec rm {} +
-maxdepth 1:仅搜索当前目录,不递归子文件夹-type f:只处理文件(排除目录)-exec rm {} +:将找到的所有文件批量传给rm执行,效率比-exec rm {} \;更高
内容的提问来源于stack exchange,提问作者user17732557
相关产品推荐
相关产品推荐

