2013-07-01 4 views
3

Я пишу быстрый скрипт, чтобы пройти через огромное количество музыки, чтобы преобразовать все m4as в mp3. Большинство из них - это уже mp3, но я бы хотел, чтобы все они были mp3. Вот то, что я до сих пор:Рекурсия через каталог и конвертирование музыки

for f in *.m4a; do ffmpeg -i "$f" -acodec libmp3lame -ab 320 "${f%.m4a}.mp3"; done 

ли это на одном уровне, как я могу интегрировать этот ffmpeg в команду find сделать это рекурсивно?

Спасибо за помощь!

+0

Посмотрите на [эту тему] (http://stackoverflow.com/a/15930451/828193). Чтобы отфильтровать имена файлов в команде 'find', используйте опцию' -name '* .m4a'' – user000001

ответ

7

Если вы хотите также петли во вложенных папках, вы можете использовать globstar оболочки дополнительное поведение, увидеть Pattern Matching section of the reference manual и Shopt Builtin section of the reference manual, как так:

shopt -s globstar 
for f in **/*.m4a; do ffmpeg -i "$f" -acodec libmp3lame -ab 320 "${f%.m4a}.mp3"; done 

Использование find это немного сложнее, так как вы с помощью Shell Parameter Expansion. Вот вероятность того, что будет 100% гарантией безопасности в отношении файлов с пробелами или другими забавными символами в названии:

find . -name '*.m4a' -type f -exec bash -c 'ffmpeg -i "$0" -acodec libmp3lame -ab 320 "${0%.m4a}.mp3"' {} \; 

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


В -exec заявлении find, я использую bash -c '...'. В этом случае, каждый параметр дается после строки, которая будет выполнен будет установлена ​​в качестве позиционных параметров, индексируется 0, отсюда $0, что появляется в коде

ffmpeg -i "$0" -acodec libmp3lame -ab 320 "${0%.m4a}.mp3" 

Надежда это помогает!

+0

Я использовал «находку», которую вы предложили, и она сработала! Благодаря! –

+1

@OsmiumUSA Это был лучший выбор! Но эй, ваш вопрос был корректным, и вы показали немного исследований. Вопрос не в том, что «просьба дать мне вопрос», поэтому вы заслужили хороший ответ. –