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

如何在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

使用步骤

  1. 将上述代码保存为rename_frames.sh文件
  2. 赋予脚本执行权限:
    chmod +x rename_frames.sh
    
  3. 切换到PNG文件所在目录,运行脚本:
    ./rename_frames.sh
    

关键说明

  • 跳过已转换文件:通过检测文件名中的冒号,避免重复处理已完成转换的文件
  • 十进制解析:10#$raw_ms确保前导零的毫秒数被正确解析为十进制(例如000000001会被转为1)
  • 超长时长兼容:纯算术计算不依赖系统时间限制,支持任意小时数的毫秒转换
  • 安全重命名:mv -n参数会跳过同名文件,避免意外覆盖

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 21:32:45