выполните команду ffmpeg в цикле

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

этот скрипт :

#!/bin/bash
find ./ -name "*.wav" -print | while read f
do
    name=${f:2:${#f}-6}
    cmd='ffmpeg -i "$name.wav" -ab 320k -ac 2 "$name.mp3"'
    eval $cmd<br>
done

3 ответов


нет причин для найти, просто использовать Баш подстановочный знак globbing

#!/bin/bash
for name in *.wav; do
  ffmpeg -i "$name" -ab 320k -ac 2 "${name%.*}.mp3" 
done 

Если вам нужен find (для поиска в подкаталогах или выполнения более расширенной фильтрации) попробуйте следующее:

find ./ -name "*.wav" -exec ffmpeg -i "{}" -ab 320k -ac 2 '$(basename {} wav)'.mp3 \;

трубопровод выход find до while loop имеет два недостатка:

  1. он терпит неудачу в (возможно, редкой) ситуации, когда совпадающее имя файла содержит символ новой строки.
  2. ffmpeg, по какой-то неизвестной мне причине, будет считываться со стандартного ввода, который мешает

использовать -nostdin флаг в командной строке ffmpeg

ffmpeg -nostdin -i "$name.wav" -ab 320k -ac 2 "$name.mp3"