我有大量的png文件,它们的命名方式如下:
PREFIX_00000000.png
其中
PREFIX_
是一个固定的字符串,后面跟着八个数字(可能更多)。这些数字代表毫秒。
现在我正在寻找一种将文件名从给定格式转换为
PREFIX_HH:mm:ss.ffff.png
格式的方法。 (字符串,后跟小时:分钟:秒。毫秒)。
转折点?这应该通过 bash (Ubuntu) 来完成。
你们有没有人这样做过?或者有解决办法吗?
使用任何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.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 格式字符串)。