You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本如何正确匹配含多位数字片段的文件名实现移动操作

Bash匹配多位数段文件重命名移动方案

原有[0-9]通配符仅能匹配单个数字,无法适配多位数场景;直接使用*[0-9]通配符范围太广,会匹配到多个不符合规则的文件,导致命令执行异常,可通过以下两种方案实现需求:

方案1:使用Bash扩展通配符(extglob)精准匹配

Bash的扩展通配符支持+([pattern])语法,可匹配一次及以上的规则字符,适配1位到任意位数的数字场景:

  1. 先开启扩展通配符支持:
shopt -s extglob
  1. 匹配规则调整为${prefix}_+([0-9])_${suffix},即可匹配任意位数的中间数字段。
  2. 完整可运行脚本示例:
#!/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:15:03