Я хочу, чтобы следующий цикл проходил через файлы m4a и файлы webm. На данный момент я использую две разные петли, другая просто заменяет все m4a из этой петли. Кроме того, файлы, которые выводит ffmpeg, должны удалить расширение m4a, если это был файл m4a, и расширение webm, если это был файл webm. И замени это на mp3. (Как это происходит здесь с m4a). Я понятия не имею, как это сделать, я думаю, что это как-то связано с выражениями регулярных выражений, но я понятия не имею, как на самом деле их использовать, и я никогда не нашел хорошего учебника / документации, поэтому, если он у вас есть, пожалуйста, свяжите его также ,

for i in *.m4a ; do
        echo "Converting file $converted / $numfiles : $i"
        ffmpeg -hide_banner -loglevel fatal -i "$i" "./mp3/${i/.m4a}.mp3"
        mv "$i" ./done
        converted=$((converted + 1))
done

1 ответ1

2

Чтобы перебрать несколько групп файлов в bash, просто укажите их все в списке for.
Если не существует файла, соответствующего группе (например, нет файла * .webm), то цикл по- прежнему выполняется один раз (со спецификацией группы (* .webm) в качестве значения переменной i). Если вы хотите предотвратить это, вам нужно установить параметр nullglob:
shopt -s nullglob

Чтобы удалить расширение из имени файла (которое имеет расширение!) используйте расширение этого параметра:${i%.*}

Ваш сценарий будет выглядеть так:

shopt -s nullglob
for i in *.m4a *.webm; do
        echo "Converting file $converted / $numfiles : $i"
        ffmpeg -hide_banner -loglevel fatal -i "$i" "./mp3/${i%.*}.mp3"
        mv "$i" ./done
        converted=$((converted + 1))
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .