通过目录递归并转换音乐

时间:2013-07-01 16:18:59

标签: bash mp3 m4a

我正在编写一个快速脚本来浏览大量音乐,将所有m4as转换为mp3。他们中的大多数已经是mp3,但我希望所有这些都是mp3。这是我到目前为止所做的:

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

是否在一个级别上,如何将此ffmpeg集成到find命令中以递归方式执行此操作?

感谢您的帮助!

1 个答案:

答案 0 :(得分:7)

如果您还要在子文件夹中循环,可以使用globstar shell可选行为,请参阅Pattern Matching section of the reference manualShopt 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"' {} \;

如果您拥有大量文件,第二种可能性可能会更快,因为已知 globbing对于大量文件来说非常慢。


-exec的{​​{1}}声明中,我正在使用find。在这种情况下,在要执行的字符串之后给出的每个参数都将被设置为位置参数,从bash -c '...'索引,因此代码中出现的0

$0

希望这有帮助!