如何将文件名从 PREFIX_00000000.png 批量转换为 PREFIX_HH:mm:ss.ffff.png

问题描述 投票:0回答:2

我有大量的png文件,它们的命名方式如下:

PREFIX_00000000.png

其中

PREFIX_
是一个固定的字符串,后面跟着八个数字(可能更多)。这些数字代表毫秒。

现在我正在寻找一种将文件名从给定格式转换为

PREFIX_HH:mm:ss.ffff.png
格式的方法。 (字符串,后跟小时:分钟:秒。毫秒)。

转折点?这应该通过 bash (Ubuntu) 来完成。

你们有没有人这样做过?或者有解决办法吗?

bash sh filenames datetime-conversion
2个回答
1
投票

使用任何awk:

$ cat tst.sh
#!/usr/bin/env bash

shopt -s extglob

while read -r old new; do
    echo mv -- "$old" "$new"
done < <(
    printf '%s\n' PREFIX_+([[:digit:]]).png |
    awk -F '[_.]' '{
        hrs  = int( ($2 / (1000 * 60 * 60)) )
        mins = int( ($2 / (1000 * 60)) % 60 )
        secs = int( ($2 / 1000) % 60 )
        ms   = $2 % 1000
        printf "%s %s_%02d:%02d:%02d.%04d.%s\n", $0, $1, hrs, mins, secs, ms, $3
    }'
)

$ ./tst.sh
mv -- PREFIX_10799999.png PREFIX_02:59:59.0999.png
mv -- PREFIX_12345678.png PREFIX_03:25:45.0678.png
mv -- PREFIX_87654321.png PREFIX_24:20:54.0321.png

一旦你对结果满意就删除

echo
,如果你真的想要格式
%04d
而不是你说的,
%03d
.
检查数学并在必要时进行调整,因为我大部分时间只是将它从
从毫秒复制到小时、分钟、秒和毫秒

PREFIX_HH:mm:ss.fff.png


1
投票
PREFIX_HH:mm:ss.ffff.png
 替换为 
ms2hms()( for i; do if ! [[ $i =~ ^(.+_)([0-9]+)([0-9]{3})(\.png)$ ]]; then echo 1>&2 bad filename: "$i" continue fi pre=${BASH_REMATCH[1]} sfx=${BASH_REMATCH[4]} f=${BASH_REMATCH[3]} t=${BASH_REMATCH[2]} (( s = t%60, t = t/60, m = t%60, h = t/60 )) printf -v o '%s%02d:%02d:%02d.%03d%s' "$pre" $h $m $s $f "$sfx" echo mv -i "$i" "$o" done )

并将

{3}
替换为
{4}
(或者如果输入实际上是毫秒但您仍然需要 4 位数字,则将固定的
%03d
附加到 printf 格式字符串)。
    

© www.soinside.com 2019 - 2024. All rights reserved.