bash - 使用 bash 脚本以自然顺序列出文件夹中的文件

标签 bash shell ffmpeg

我正在尝试使用 ffmpeg 合并几个 flv 文件. ffmpeg需要这种格式的文件列表:

file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'

通过一些搜索和试验,我想出了这个单行命令:
ffmpeg -safe 0 -f concat -i <(for entry in "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"/*.flv;do echo "file '$entry'";done) -c copy output.flv

括号中的脚本将生成当前文件夹中所有文件的路径列表,格式为 ffmpeg 所需的格式。 :
for entry in "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"/*.flv;do echo "file '$entry'";done

但是,这仅按字母数字顺序列出文件:
6846641-10.flv
6846641-11.flv
6846641-12.flv
6846641-13.flv
6846641-14.flv
6846641-15.flv
6846641-16.flv
6846641-17.flv
6846641-18.flv
6846641-19.flv
6846641-1.flv
6846641-20.flv
6846641-21.flv
6846641-22.flv
6846641-23.flv
6846641-24.flv
6846641-2.flv
6846641-3.flv
6846641-4.flv
6846641-5.flv
6846641-6.flv
6846641-7.flv
6846641-8.flv
6846641-9.flv

要正确合并视频,我需要按自然顺序列出文件,如下所示:

自然排序的文件

enter image description here

如图,文件需要按-后面的数字排序从 1 到 24,与 6846641-1.flv在第一行和 6846641-24.flv在最后一行。格式如下:
file '/mnt/c/Users/Oho/Desktop/save//6846641-xx.flv'

是否可以为 ffmpeg 生成格式正确的列表?使用 bash 脚本(如果可以的话,在一行中)?

编辑:
感谢 Cyrus,修改后的代码就在这里,它可以完成工作:
#!/bin/bash
for entry in "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"/*.flv
do 
    echo "file '$entry'" >> fileOutputList.temp
done
sort -t "-" -n -k 2 fileOutputList.temp > fileOutputListSorted.temp
ffmpeg -safe 0 -f concat -i fileOutputListSorted.temp -c copy output.flv
rm fileOutputList.temp
rm fileOutputListSorted.temp

最佳答案

我建议:

sort -t "-" -n -k 2 file

-t "-": use - as separator

-n: compare according to string numerical value

-k2,2: start a key at column 2

关于bash - 使用 bash 脚本以自然顺序列出文件夹中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41659018/

相关文章:

linux - 如何使用重定向和管道制作 bash 命令字符串?

linux - 在 bash 中的每个命令后执行命令

ffmpeg - 使用 FFMPEG 解析 NAL 单元

c++ - 将来自网络摄像机 (RTSP) 的帧保存到 mp4 文件

bash - 关联数组的键 ${!a[@]} 和值 ${a[@]} 是否以相同的顺序展开?

perl - 如何在 shell 脚本中处理 Perl 数组元素?

bash - 如何在 BASH 中找到所有出现在 `\word{}` 之间的单词?

linux - 远程执行需要输入的 bash 脚本

linux - 这个shell脚本有什么错误

ffmpeg - PHP imagick 相当于 -define png :color-type=6