我如何重命名一系列不带前面零填充的文件,以便它们可以有前面零填充?

我如何重命名一系列不带前面零填充的文件,以便它们可以有前面零填充?

我有一系列文件:

file0.png, file1.png, ..., file10.png,... file100.png, ..., file1000.png, file1001.png, ..., file10000.png

我想用 ffmpeg 制作视频,

ffmpeg -framerate 30 -pattern_type glob -i '*.png' -c:v libx264 out.mp4

命名约定导致输入中读取的文件顺序错误。我该如何解决这个问题?

所谓的解决方案“如何在命令提示符中重命名一堆文件?”不起作用!

答案1

因为 archlinux 的重命名实用程序存在一些问题,所以我在实时 Ubuntu 上启动并进行了重命名。

rename 's/\d+/sprintf("%05d", $&)/e' *.png  

这就是 toto 重命名文件序列所做的操作。

答案2

最初我查看了ffmpeg的文档,看看是否可以在自己的文件中指定输入文件名,然后可以根据需要对其进行排序。但文档中没有明确提供这样的选项。我可能是错的,如果您注意到这样的选项,那将是我的建议。

因此,您应该按照您想要的顺序重命名输入文件。我假设您使用的是 bash shell,文件位于同一目录中,所有文件都命名file1.pngfile10000.png,并且您希望将它们命名file00001.pngfile10000.png

#!/bin/bash
for f in file*.png
do
  printf -v n "file%05d.png" "${f:4:-4}"
  mv "$f" "$n"
done

一行如下:
for f in file*.png; do printf -v n "file%05d.png" "${f:4:-4}"; mv "$f" "$n"; done

或者可能只是:

#!/bin/bash
for (( i=0; i<10000; i++ ))
do
  printf -v n "%05d" $i
  mv "file$i.png" "file$n.png"
done

一行如下:
for (( i=0; i<10000; i++ )); do printf -v n "%05d" $i; mv "file$i.png" "file$n.png"; done;

我不确定哪个更快,但我怀疑第二个会更快。

相关内容