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

Я пытаюсь сделать сценарий, чтобы взять несколько серий последовательностей изображений в подкаталогах существующего рабочего каталога и отправить их через 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

Мои текущие основные проблемы, о которых я знаю, являются ими:

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

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

ОБНОВЛЕНИЕ 1: (После применения предложений Ron)

Еще раз спасибо 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 примите несколько длин цифры. У меня нет идей для этого прямо сейчас. Если бы кто-либо знает, я ценил бы знание, но возможно я могу найти его прочесывающий документацию расширения параметра, как будто у меня не было более чем достаточного количества этого в течение одного времени жизни.:)

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

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

IMGSEQ=$(echo ${FIRSTFILE%.*} | grep -iEo "[a-z]+")
  1. ${FIRSTFILE%.*} берет первый файл и снимает изоляцию с расширения.
  2. grep является поиском шаблона
  3. -i часть -iEo должен заставить grep принять прописные и строчные соответствия шаблона.
  4. -E часть -iEo к (заключающий в кавычки из man grep) "Интерпретируйте ШАБЛОН как расширенное регулярное выражение". Независимо от того, что это означает.
  5. -o часть -iEo должен только распечатать шаблон соответствия.
  6. [a-z] должен соответствовать шаблону любой буквы алфавита
  7. + говорит 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! Я определенно не смог бы закончить без Вашей справки.

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

1 ответ

Я не знаю, как получить имя файла просто первого файла в каталогах. 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"
1
ответ дан 7 December 2019 в 16:12

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

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