如何修复Bash中检查含数字格式文件名是否存在的命令?
修复Bash脚本中的文件格式检查命令
原脚本的问题在于直接用[ ! -f ]搭配通配符无法正确判断是否存在符合格式的文件——-f仅支持检查单个文件,通配符展开后若匹配多个文件会导致参数错误,无匹配时通配符会被当作字面文件名处理,导致判断逻辑失效。同时[0-9]{8}这类重复次数语法不属于Bash基础通配符范畴,无法直接使用。
以下是两种可靠的修复方案:
方案一:精准匹配固定长度数字(推荐)
使用compgen -G来匹配符合格式的文件,该命令会自动展开通配符并返回是否存在匹配项:
config_path="mypath/" outD="outDir/" for doms in Germ500 Port500 Spai500;do echo "animating for: ${doms}" config_name="${doms}_config.toml" # 检查是否存在符合格式的文件 if compgen -G "${outD}${doms}_titt_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]T[0-9][0-9][0-9][0-9]_animation.html" > /dev/null; then echo "${outD}${doms}_titt_*_animation.html 已存在" else echo "未找到符合格式的文件,将生成新文件" # 在这里添加生成新文件的命令 fi done
[0-9][0-9]...(连续8次)确保匹配恰好8位数字,后续4个[0-9]匹配恰好4位数字,比原脚本的????????更精准,不会误匹配非数字字符。compgen -G会根据通配符模式生成匹配的文件名列表,有匹配时返回退出码0,否则返回非0;重定向>/dev/null是为了只判断结果不输出文件名。
方案二:使用扩展通配符简化写法
如果觉得写8个[0-9]过于繁琐,可以开启Bash的扩展通配符功能,用+([0-9])匹配任意长度的数字(注意:此模式不限制数字长度,若需严格匹配8位/4位仍建议用方案一):
# 开启扩展通配符(可放在脚本开头) shopt -s extglob config_path="mypath/" outD="outDir/" for doms in Germ500 Port500 Spai500;do echo "animating for: ${doms}" config_name="${doms}_config.toml" # 检查是否存在含数字段的目标文件 if compgen -G "${outD}${doms}_titt_+([0-9])T+([0-9])_animation.html" > /dev/null; then echo "${outD}${doms}_titt_*_animation.html 已存在" else echo "未找到符合格式的文件,将生成新文件" # 在这里添加生成新文件的命令 fi done
内容的提问来源于stack exchange,提问作者YoKu
相关产品推荐
相关产品推荐

