如何按照“完整编号名称”对文件进行排序?

如何按照“完整编号名称”对文件进行排序?

我正在尝试用一些 png 文件(实际上有 1000 个)制作视频。它们以数字命名,但步长为 5000,即0.png5000.png等等10000.png

我正在尝试使用命令创建视频

ffmpeg -framerate 2 -pattern_type glob -i "*.png" test.mp4

但我遇到的问题是,它不是按其孔值对它们进行排序,而是使用文件名的第一位数字对它们进行排序。因此,我在动画中得到的顺序是

0.png
1000000.png
100000.png
10000.png
1005000.png
1010000.png
... etc

这不是我想要的顺序。

我尝试使用以下信息重命名它们这个帖子,但如果我循环遍历目录,我会按照同样不理想的顺序进行。因此重命名的文件将被错误地枚举。

我怎样才能让 bash 以正确的方式对它们进行排序?

答案1

你可以做几件不同的事情:


使用填充零重命名您的文件:

0000000.png
0010000.png
0100000.png
1000000.png
1005000.png
1010000.png

使用版本排序选项:

file_args=()
while IFS= read -r file; do
    file_args+=( -i "$file" )
done < <(ls -v *.png)
# ..........^^
# or
#      <(ls *.png | sort -V)

然后

ffmpeg -framerate 2 "${file_args[@]}" test.mp4

答案2

一行:

cat $(find . -maxdepth 1 -name '*.png' -print | sort -V) | ffmpeg -framerate 2 -i - -vf format=yuv420p -movflags +faststart output.mp4

许多玩家不喜欢 2 fps,因此如果它不起作用,请添加-r 10输出选项,它将复制帧来补偿(输出看起来相同,持续时间相同)。

相关内容