Я пытаюсь сделать сценарий, чтобы взять несколько серий последовательностей изображений в подкаталогах существующего рабочего каталога и отправить их через ffmpeg для создания видеофайлов в существующем рабочем каталоге, названном в честь каталогов. Это осложнено тем, что имена последовательности изображений варьируются, как делает стартовое количество последовательностей, но настоящая проблема, я являюсь новым для избиения сценариев. Вот пример файлов:
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
Мои текущие основные проблемы, о которых я знаю, являются ими:
ls dir/ | sort -n | head -1
работы в терминале, но не в сценарии.renderSix00001.png-renderSix99999.png
и renderSeven001.png-renderSeven999.png
также? Это - также проблема с получением строки $IMGSEQ
, и %04d
в ffmpeg строке должен был бы быть изменен так или иначе.$IMGSEQ
переменная, смешивающаяся с %04d
во входном имени файла ffmpeg без скобок, но я далеко еще не получил это. Какой синтаксис делают я использую там $IMGSEQ(%04d).$EXTEN
или $IMGSEQ {%04d}.$EXTEN
возможно? (Материал как это - то, почему он сосет для перехода в глубине сценариев),ls
в for DIR in (ls -d */)
осужден, но я не знаю, как еще отфильтровать любые файлы в существующем рабочем каталоге и просто работать над каталогами.)Я уверен, что сценарий похож на полную путаницу. Любое полное руководство для получения всего этого, работа очень приветствовалась бы, но если ни у кого нет терпения обойти меня через все это, если я могу просто получить некоторое получение справки и парсинг имен файлов, возможно, я могу зафиксировать остальных сам.Спасибо.
Еще раз спасибо Ron! Это - почти заключительный сценарий:
#!/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 принимать имена, включающие несколько длин цифры, который является), Работающий на основе предложения Ron на $STARTNO
использование (echo $FIRSTFILE | grep -Eo "[0-9]+")
Я придумал
IMGSEQ=$(echo ${FIRSTFILE%.*} | grep -iEo "[a-z]+")
${FIRSTFILE%.*}
берет первый файл и снимает изоляцию с расширения.-i
часть -iEo
должен заставить grep принять прописные и строчные соответствия шаблона.-E
часть -iEo
к (заключающий в кавычки из man grep
) "Интерпретируйте ШАБЛОН как расширенное регулярное выражение". Независимо от того, что это означает.-o
часть -iEo
должен только распечатать шаблон соответствия.[a-z]
должен соответствовать шаблону любой буквы алфавита+
говорит grep, что предыдущий шаблон алфавита должен быть подобран "один или несколько раз" (также - он много раз для получения всех букв).Ограничение этого - то, что это не обработало бы имена файлов со специальными символами как -
или _
, но я могу жить с этим на данный момент.
Таким образом, вот полуфинальный сценарий!
#!/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=$(echo ${FIRSTFILE%.*} | grep -iEo "[a-z]+")
EXTEN=${FIRSTFILE#*.}
OUTPUT=${DIR%/}
ffmpeg -n -start_number $STARTNO -i "$DIR$IMGSEQ"%0"$DIGITNO"d".$EXTEN" $OUTPUT.mkv
done
Таким образом выполненный в каталоге с некоторыми каталогами, названными как мои каталоги в качестве примера выше (кроме я добавил один с последовательностью изображений, дополненной больше чем 4 нулями, чтобы удостовериться, что работал также), этот сценарий выполнит следующие 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', прекрасный! Большое спасибо снова для Вашей справки Ron! Я определенно не смог бы закончить без Вашей справки.
Я не знаю, как получить имя файла просто первого файла в каталогах. dir ls / | вид-n | возглавляет-1 работу в терминале, но не в сценарии.
Можно хотеть переписать:
for DIR in (ls -d */); do
1STFILE=(ls $dir/ | sort -n | head -1)
как
for DIR in (ls -d */)
do
1STFILE=$(ls $DIR | sort -n | head -1)
Есть ли способ заставить его принять
renderSix00001.png-renderSix99999.png
иrenderSeven001.png-renderSeven999.png
также?
Если Вы следовали за вышеупомянутым затем:
STARTNO=$(echo $1STFILE | grep -Eo "[0-9]+")
должен получить все числа в имени файла.
Какой синтаксис делают я использую там
$IMGSEQ(%04d).$EXTEN
или$IMGSEQ {%04d}.$EXTEN
возможно?
Вставленный та вещь ""
так:
ffmpeg -start_number $STARTNO -i "$IMGSEQ%4d.$EXTEN" "$DIR.mkv"
Теперь, если Вы используете просто "$IMGSEQ%4d.$EXTEN"
Вы собираетесь совершить нападки, проблема (попробуйте его для наблюдения, каково это!). Поэтому сделайте его "$DIR$IMGSEQ%4d.$EXTEN"
Если Вы используете "$DIR.mkv"
это собирается создать скрытый файл .mkv
который не является тем, что Вы хотите. Одним not-so-cool путем я думал, должен сохранить только название каталога путем разделения суффикса /
в переменной:
OUTPUT=$(echo $DIR | sed 's/\/$//')
и используйте это в ffmpeg
как в:
ffmpeg -start_number $STARTNO -i "$DIR$IMGSEQ%4d.$EXTEN" "$OUTPUT.mkv"