我正在尝试将一个充满mp3的目录(文件名中有空格)转换为m4a。
转换单个文件(可行):
ffmpeg -i Traffic.mp3 -c:a libfaac -vn Traffic.m4a
失败的命令(在OS X Mavericks上):
find . -name \*.mp3 -print0 | xargs -0 ffmpeg -i {} -c:a libfaac -vn {}.m4a
答案 0 :(得分:1)
find . -name '*.mp3' -type f -exec bash -c 'ffmpeg -i "$0" -c:a libfaac -vn "${0%.mp3}.m4a"' {} \;
答案 1 :(得分:0)
为什么使用xargs
? find -exec
就够了:
find . -name \*.mp3 -exec ffmpeg -i {} -c:a libfaac -vn {}.m4a \;
问题是xargs
与find -exec … +
更相似,而不是find -exec … \;
。它最好只启动一个命令实例,用输入中读取的空格分隔项(或多或少)替换单个{}
。如果您希望xargs
的行为与find -exec … \;
相似,则需要指定-I{}
(xargs -0 -I{} ffmpeg …
)。
这会将Traffic.mp3
转换为Traffic.mp3.m4a
。如果您想将转化结果保存到Traffic.m4a
,则可以
-exec
操作中执行shell,并在追加.mp3
或.m4a
xargs
sed
分机之后使用.mp3
远离find
结果。我投票支持最后一个选项,因为它执行的进程较少(而且shell非常大,但是ffmpeg
会非常大,以至于性能上的差异可以忽略不计)。
find . -name \*.mp3 | sed 's/\.mp3$//' | xargs -I{} ffmpeg -i {}.mp3 -c:a libfaac -vn {}.m4a