Я пытаюсь сделать сценарий для выполнения нескольких серий последовательностей изображений в подкаталогах текущего рабочего каталога и отправить их через 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 */) неодобрительно, но я не знаю, как еще отфильтровать любые файлы в текущем рабочем каталоге и просто работать с каталогами.)Я уверен, что сценарий выглядит как полный беспорядок. Любое общее руководство, чтобы получить всю работу, было бы очень желанным, но если у кого-то нет терпения, чтобы пройти меня через все это, если я могу просто получить некоторую помощь в получении и анализе имен файлов, возможно, я смогу исправить остальное самостоятельно. Спасибо.
Еще раз спасибо Рон! Это почти финальный скрипт:
#!/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 принимать несколько цифр. У меня нет никаких идей для этого прямо сейчас. Если кто-нибудь знает, я был бы признателен за знание, но, может быть, я могу найти его, расчесывая документацию по расширению параметров, как если бы у меня было не так уж и достаточно, чтобы на одну жизнь. :)
Подумал! (Как заставить 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! Большое спасибо за вашу помощь Рон! Я определенно не смог бы закончить без вашей помощи.