while read filename; do
input="Музыка/$filename"
corr_name=$(echo "$filename" | sed 's/[\?\*\:]/_/g')
output="Музыка.output/${corr_name%.*}.ogg"
mkdir -p "$(dirname "$output")"
ffmpeg -i "$input" -c:a libvorbis -q:a 10 -vn "$output"
echo ВХОД "$input" ВЫХОД "$output"
done < <(find Музыка -type f -printf '%P\n')
Суть: полностью скопировать иерархию Музыка в Музыка.output с перекодировкой в .ogg. Что странно: в процессе выполнения ffmpeg как-то криво получает имена файлов (и, похоже, их корёжит в самих переменных (понимаю, бред. Но иного объяснения у меня нет)), в результате чего Unheilig превращается то в nheilig, то в eilig, а «Reignite - Mass Effect Tribute Song» превращается в «s Song» (это к примеру). При этом, echo «$input» «$output» тоже показывают бред из скрипта. НО! Если я заменю ffmpeg на libav, или вообще уберу конвертацию из скрипта, т.е. оставлю только создание директорий и выхлоп или вообще только выхлоп, то всё работает прекрасно! Я не понимать. Пожалуйста, помогите.
Да, сталкивался с таким же решал через костыли, запуск отдельного шела которому передавалось имя файла в котором уже запускался ffmpeg-a для каждого файла.
И правильно ли я понимаю суть твоего манёвра? Создаются два скрипта. Один генерирует имя входного файла и имя выходного, в другом живёт только ffmpeg, который принимает два аргумента на вход. Этот самый второй скрипт выполняется для каждой строки, выходящей из первого скрипта.