如何在Ubuntu Bash中批量转换PNG文件名:毫秒转时间戳格式
批量重命名PNG帧文件:毫秒转时分秒.毫秒格式(Bash实现)
需求背景
现有一批从视频提取的PNG帧文件,命名格式为PREFIX_xxxxxx.png,其中PREFIX是固定前缀,后续数字代表视频起始后的毫秒数(支持任意位数,超过24小时也需兼容)。需要将文件名转换为PREFIX_HH:mm:ss.fff.png格式,例如FRAMES_49291677.png转为FRAMES_13:41:31.677.png。
解决方案
以下是Ubuntu Bash环境下的批量处理脚本,通过纯算术计算实现时间格式转换,避免date命令对超长时长的限制:
#!/bin/bash # 遍历所有符合前缀_数字.png格式的文件 for file in *_*.png; do # 跳过已完成转换的文件(文件名含冒号) if [[ "$file" == *:* ]]; then continue fi # 提取前缀和原始毫秒数 prefix="${file%%_*}" raw_ms="${file#*_}" raw_ms="${raw_ms%.png}" # 将毫秒数转为十进制整数(避免前导0被解析为八进制) ms=$((10#$raw_ms)) # 计算时间分量 total_sec=$((ms / 1000)) fff=$((ms % 1000)) hours=$((total_sec / 3600)) remaining_sec=$((total_sec % 3600)) minutes=$((remaining_sec / 60)) seconds=$((remaining_sec % 60)) # 格式化时间字符串:小时不限制位数,分/秒补两位,毫秒补三位 time_part=$(printf "%d:%02d:%02d.%03d" "$hours" "$minutes" "$seconds" "$fff") # 生成新文件名 new_name="${prefix}_${time_part}.png" # 预览重命名操作(确认无误后可删除echo,直接执行mv) echo mv -vn "$file" "$new_name" # mv -vn "$file" "$new_name" done
使用步骤
- 将上述代码保存为
rename_frames.sh文件 - 赋予脚本执行权限:
chmod +x rename_frames.sh - 切换到PNG文件所在目录,运行脚本:
./rename_frames.sh
关键说明
- 跳过已转换文件:通过检测文件名中的冒号,避免重复处理已完成转换的文件
- 十进制解析:
10#$raw_ms确保前导零的毫秒数被正确解析为十进制(例如000000001会被转为1) - 超长时长兼容:纯算术计算不依赖系统时间限制,支持任意小时数的毫秒转换
- 安全重命名:
mv -n参数会跳过同名文件,避免意外覆盖
内容的提问来源于stack exchange,提问作者Jafix
相关产品推荐
相关产品推荐

