编写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
相关产品推荐
相关产品推荐

