Объединить каталог и имя файла в GNU параллельно - PullRequest
2 голосов
/ 16 февраля 2020

У меня следующая структура каталогов:

dir1/file.ogg
dir2/file.ogg
dir3/file.ogg
     file2.ogg

Я хотел бы преобразовать все .ogg файлы в .wav с помощью GNU Parallel. Вот где я дошел до сих пор:

find . -name '*.*' -type f -print0 | parallel -0 ffmpeg -i {} outputdir/{/.}.wav

Проблема здесь в том, что, хотя очевидно, что каталоги имеют разные имена, файлы внутри имеют одинаковые имена. Вышеупомянутая команда будет постоянно перезаписывать содержимое каталога. Вместо этого я хотел бы:

outputdir/dir1_file.ogg
outputdir/dir2_file.ogg
outputdir/dir3_file.ogg
outputdir/dir3_file2.ogg

По сути, я хотел бы извлечь имя подкаталога и объединить его с именем файла и добавить собственное расширение.

Есть идеи?

1 Ответ

3 голосов
/ 16 февраля 2020

Используя преобразование perl, эта команда должна достичь требуемого эффекта:

find . -name '*.ogg' -type f -print0 | parallel -0 echo ffmpeg -i {} outputdir/{= '$_ =~ s[^\./][]; $_ =~ s[/][_]g; $_ =~ s[ogg$][wav]g;' =}

Удалить echo, чтобы запустить команду ffmpeg

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...