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

编写Bash脚本为文件名中间的数字补两位前导零

批量重命名文件:为文件名中的两组数字补两位前导零

需求说明

将文件名中包含的两组数字(如 FileName_6_15.wav 里的 6、FileName_3_7.wav 里的 3 和 7)格式化为两位数字,不足两位的自动补前导零,最终得到规范的文件名格式。


方法一:使用Perl版本rename(推荐)

绝大多数Linux发行版默认预装Perl版rename,一行命令即可完成批量重命名:

rename 's/(\d+)(_)(\d+)/sprintf("%02d_%02d", $1, $3)/e' FileName_*.wav

命令解释:

  • s/(\d+)(_)(\d+)/.../e:正则匹配文件名里的「第一组数字+下划线+第二组数字」结构,e标记表示替换内容为可执行的Perl表达式
  • sprintf("%02d_%02d", $1, $3):把匹配到的两组数字($1对应第一组、$3对应第二组)格式化为两位数字,自动补前导零,中间保留下划线

方法二:Bash循环结合sed(兼容util-linux版rename)

如果你的系统预装的是功能受限的util-linux版rename,可以用Bash循环配合sed实现:

for file in FileName_*.wav; do
    new_name=$(echo "$file" | sed -E 's/([0-9]+)_([0-9]+)/printf "%02d_%02d" \1 \2/e')
    mv -v "$file" "$new_name"
done

命令解释:

  • 遍历所有匹配FileName_*.wav的目标文件
  • 用sed的-E启用扩展正则,匹配两组数字,通过e选项执行printf命令生成格式化后的新文件名
  • mv -v执行重命名,-v选项会输出重命名详情,方便验证结果

方法三:Bash循环结合awk

如果需要更灵活的字段分割控制,可使用awk处理:

for file in FileName_*.wav; do
    new_name=$(echo "$file" | awk -F '_' '{printf "%s_%02d_%02d%s\n", $1, $2, $3, substr($0, index($0,$4))}')
    mv -v "$file" "$new_name"
done

命令解释:

  • 以下划线_为分隔符拆分文件名,将第二、第三个字段(对应两组数字)格式化为两位
  • 拼接原前缀、格式化后的数字和原后缀,生成符合要求的新文件名

测试建议

在执行真实重命名操作前,可先将mv替换为echo,预览生成的新文件名是否符合预期:

for file in FileName_*.wav; do
    new_name=$(echo "$file" | sed -E 's/([0-9]+)_([0-9]+)/printf "%02d_%02d" \1 \2/e')
    echo "$file -> $new_name"
done

内容的提问来源于stack exchange,提问作者mr_blond

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 23:30:05