我正在编写一个快速脚本来浏览大量音乐,将所有m4as转换为mp3。他们中的大多数已经是mp3,但我希望所有这些都是mp3。这是我到目前为止所做的:
for f in *.m4a; do ffmpeg -i "$f" -acodec libmp3lame -ab 320 "${f%.m4a}.mp3"; done
是否在一个级别上,如何将此ffmpeg
集成到find
命令中以递归方式执行此操作?
感谢您的帮助!
答案 0 :(得分:7)
如果您还要在子文件夹中循环,可以使用globstar
shell可选行为,请参阅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"' {} \;
如果您拥有大量文件,第二种可能性可能会更快,因为已知bash globbing对于大量文件来说非常慢。
在-exec
的{{1}}声明中,我正在使用find
。在这种情况下,在要执行的字符串之后给出的每个参数都将被设置为位置参数,从bash -c '...'
索引,因此代码中出现的0
$0
希望这有帮助!