找到xargs mac更改文件扩展名

时间:2014-01-27 01:17:55

标签: linux macos bash ffmpeg xargs

我正在尝试将一个充满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

2 个答案:

答案 0 :(得分:1)

find . -name '*.mp3' -type f -exec bash -c 'ffmpeg -i "$0" -c:a libfaac -vn "${0%.mp3}.m4a"' {} \;

答案 1 :(得分:0)

为什么使用xargsfind -exec就够了:

find . -name \*.mp3 -exec ffmpeg -i {} -c:a libfaac -vn {}.m4a \;

问题是xargsfind -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