Bash脚本如何正确匹配含多位数字片段的文件名实现移动操作
Bash匹配多位数段文件重命名移动方案
原有[0-9]通配符仅能匹配单个数字,无法适配多位数场景;直接使用*[0-9]通配符范围太广,会匹配到多个不符合规则的文件,导致命令执行异常,可通过以下两种方案实现需求:
方案1:使用Bash扩展通配符(extglob)精准匹配
Bash的扩展通配符支持+([pattern])语法,可匹配一次及以上的规则字符,适配1位到任意位数的数字场景:
- 先开启扩展通配符支持:
shopt -s extglob
- 匹配规则调整为
${prefix}_+([0-9])_${suffix},即可匹配任意位数的中间数字段。 - 完整可运行脚本示例:
#!/bin/bash shopt -s extglob # 自定义配置项 prefix="ABC123" suffix="abc.txt" target_path="./dst" # 遍历匹配文件,避免多文件匹配冲突 for src_file in "${prefix}_"+([0-9])_"${suffix}"; do # 跳过无匹配结果的异常场景 [[ -f "${src_file}" ]] || continue dst_file="${target_path}/${prefix}_${suffix}" # 执行移动,-n参数防止覆盖已有文件 mv -n "${src_file}" "${dst_file}" done
方案2:通用规则适配(不限定固定prefix/suffix)
如果不需要限定固定的前缀和后缀,只要删除文件名中任意位置的_数字_段,可以配合sed正则替换实现:
for src_file in *.txt; do # 匹配并删除_加任意位数数字加_的片段 dst_file=$(echo "${src_file}" | sed -E 's/_[0-9]+_/_/') # 文件名有变化才执行移动 [[ "${src_file}" != "${dst_file}" ]] && mv -n "${src_file}" "${dst_file}" done
操作建议
- 正式执行前可以将
mv替换为echo mv,先打印所有待执行的命令,确认匹配逻辑符合预期后再执行实际操作,避免误删误移文件。 - 如果不需要保留扩展通配符配置,可在脚本末尾执行
shopt -u extglob关闭该特性。
内容的提问来源于stack exchange,提问作者KTS
相关产品推荐
相关产品推荐

