Сценарий Bash для преобразования нескольких последовательностей изображений в видеофайлы

Я пытаюсь сделать сценарий для выполнения нескольких серий последовательностей изображений в подкаталогах текущего рабочего каталога и отправить их через ffmpeg для создания видеофайлов в текущем рабочем каталоге, названном по каталогам. Это осложняется тем, что имена последовательностей изображений различаются, как и начальный номер последовательностей, но реальная проблема заключается в том, что я новичок в bash-скриптах. Вот пример файлов:

directoryFirstRender01
     renderOne0032.png
     renderOne0033.png
     renderOne0034.png
directoryFourthRender01
     renderFour4253.png
     renderFour4254.png
     renderFour4255.png
directoryFifthRender01
     renderFiveTwo1367.png
     renderFiveTwo1368.png
     renderFiveTwo1369.png

Вот примерный сценарий сценария, который имеет несколько проблем, о которых я знаю, и, возможно, еще много, чего я не знаю. Причина, по которой я не знаю, сколько проблем у нее есть, заключается в том, что я застрял в получении и анализе имен файлов, и без этой работы я не могу проверить остальные:

#!/bin/bash

for DIR in (ls -d */); do
    1STFILE=(ls $dir/ | sort -n | head -1)
    STARTNO=${1STFILE:(-8):4}
    IMGSEQ=${1STFILE%????.*}
    EXTEN=${1STFILE*.}
    ffmpeg -start_number $STARTNO -i $IMGSEQ%04d.$EXTEN $DIR.mkv
done

My current main проблемы, о которых я знаю, следующие:

Я не знаю, как получить имя файла только первого файла в каталогах. ls dir/ | sort -n | head -1 работает в терминале, но не в скрипте. Выделение подстроки для получения первого номера первого файла будет работать только с последовательностями изображений из 4 цифр. Есть ли способ заставить его принять renderSix00001.png-renderSix99999.png и renderSeven001.png-renderSeven999.png тоже? Это также проблема с получением строки $IMGSEQ, а %04d в строке ffmpeg необходимо каким-то образом изменить. Я думаю, что у меня будут проблемы с переменной $IMGSEQ, смешивающейся с %04d в имени файла ffmpeg без скобок, но пока я еще не получил этого. Какой синтаксис я использую там $IMGSEQ(%04d).$EXTEN или $IMGSEQ {%04d}.$EXTEN, может быть? (Например, это связано с тем, что он вскакивает в глубоком конце сценариев) (незначительная проблема: 1. Я знаю, что использование ls в for DIR in (ls -d */) неодобрительно, но я не знаю, как еще отфильтровать любые файлы в текущем рабочем каталоге и просто работать с каталогами.)

Я уверен, что сценарий выглядит как полный беспорядок. Любое общее руководство, чтобы получить всю работу, было бы очень желанным, но если у кого-то нет терпения, чтобы пройти меня через все это, если я могу просто получить некоторую помощь в получении и анализе имен файлов, возможно, я смогу исправить остальное самостоятельно. Спасибо.

UPDATE 1: (После применения предложений Рона)

Еще раз спасибо Рон! Это почти финальный скрипт:

#!/bin/bash

for DIR in $(ls -d */)
do
    FIRSTFILE=$(ls $DIR | sort -n | head -1)
    STARTNO=$(echo $FIRSTFILE | grep -Eo "[0-9]+")
    DIGITNO=${#STARTNO} 
    IMGSEQ=${FIRSTFILE%????.*}
    EXTEN=${FIRSTFILE#*.}
    OUTPUT=${DIR%/}
    ffmpeg -start_number $STARTNO -i "$DIR$IMGSEQ"%0"$DIGITNO"d".$EXTEN" $OUTPUT.mkv
done

Поскольку благодаря Ron переменная $STARTNO теперь принимает длину в несколько цифр, я использую расширение параметра длины в строке $DIGITNO, чтобы получить номер для использования в %04d, чтобы сделать его %03d или %05d по мере необходимости, чтобы он тоже работал. Я надеюсь, что либеральное использование " для отделения %04d от окружающих переменных не считается плохой формой (если бы это было, каков правильный путь?). Единственная недостающая часть скрипта (я думаю!) Заключается в том, как сделать $IMGSEQ принимать несколько цифр. У меня нет никаких идей для этого прямо сейчас. Если кто-нибудь знает, я был бы признателен за знание, но, может быть, я могу найти его, расчесывая документацию по расширению параметров, как если бы у меня было не так уж и достаточно, чтобы на одну жизнь. :)

ОБНОВЛЕНИЕ 2: (Успех!)

Подумал! (Как заставить IMGSEQ принимать имена с длиной нескольких цифр) Работает на основе предложения Рона для $STARTNO с помощью (echo $FIRSTFILE | grep -Eo "[0-9]+") Я придумал

IMGSEQ=$(echo ${FIRSTFILE%.*} | grep -iEo "[a-z]+")
Не знаю как получить имя файла только первого файла в каталогах. ls dir/ | sort -n | head -1 работает в терминале, но не в скрипте. grep - это поиск шаблона . Выделение подстроки для получения первого номера первого файла будет работать только с последовательностями изображений из 4 цифр. Есть ли способ заставить его принять renderSix00001.png-renderSix99999.png и renderSeven001.png-renderSeven999.png тоже? Это также проблема с получением строки $IMGSEQ, а %04d в строке ffmpeg необходимо каким-то образом изменить. -E часть -iEo - (цитата из man grep) «Интерпретировать PATTERN как расширенное регулярное выражение». Что бы это ни значило. Я думаю, что у меня будут проблемы с переменной $IMGSEQ, смешивающейся с %04d в имени файла ffmpeg без скобок, но я еще не получил этого еще. Какой синтаксис я использую там $IMGSEQ(%04d).$EXTEN или $IMGSEQ {%04d}.$EXTEN, может быть? (Например, это связано с тем, что он вскакивает в глубоком конце сценариев) [a-z] соответствует образцу любой буквы алфавита (незначительная проблема: 1. Я знаю, используя ls в for DIR in (ls -d */) неодобрительно, но я не знаю, как еще отфильтровать любые файлы в текущем рабочем каталоге и просто работать с каталогами.)

Ограничение этого что он не будет обрабатывать имена файлов со специальными символами, такими как - или _, но я могу жить с этим на данный момент.

Итак, вот полуфинальный скрипт!

[ f5]

Итак, запустите в каталоге с некоторыми каталогами, названными как мои примерные каталоги выше (кроме того, что я добавил один с последовательностью изображений, заполненной более чем четырьмя нулями, чтобы убедиться, что это тоже сработало), этот скрипт будет запускать следующие строки ffmpeg один за другим:

ffmpeg -n -start_number 0032 -i directoryFirstRender01/renderOne%04d.png directoryFirstRender01.mkv
ffmpeg -n -start_number 4253 -i directoryFourthRender01/renderFour%04d.png directoryFourthRender01.mkv
ffmpeg -n -start_number 01367 -i directoryFifthRender01/renderFiveTwo%05d.png directoryFifthRender01.mkv

Freakin 'perfect! Большое спасибо за вашу помощь Рон! Я определенно не смог бы закончить без вашей помощи.

1
задан 10 August 2015 в 05:14

0 ответов

Другие вопросы по тегам:

Похожие вопросы: