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

时间:2017-01-15 07:57:41

标签: 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'

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

编辑: 感谢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

1 个答案:

答案 0 :(得分:0)

我建议:

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

-t "-":使用-作为分隔符

     

-n:根据字符串数值

进行比较      

-k2,2:在第2列启动密钥