2017-01-15 2 views
0

Я пытаюсь объединить несколько файлов flv с помощью ffmpeg. ffmpeg требует списка файлов в этом формате:Список файлов в папке в натуральном порядке с использованием сценария bash

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 с Баш скрипт (и в одной строке, если достижимы)?

Edit: Благодаря Кира, измененный код здесь, и это делает работу:

#!/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 
+0

Пожалуйста, обратите внимание на: [Что я должен делать, когда кто-то отвечает на мой вопрос] (Http: // StackOverflow .com/помощь/кто-то-ответы) – Cyrus

ответ

0

Я предлагаю:

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

-t "-": использовать - в качестве разделителя

-n: сравнить в соответствии с числовым значением строкового

-k2,2: начать ключ в колонке 2