我正在尝试将一个完整的mp3目录(文件名中有空格)转换为m4a。找到xargs mac更改文件扩展名
要转换单个文件(这个工程):
ffmpeg -i Traffic.mp3 -c:a libfaac -vn Traffic.m4a
发生故障的命令(在OS X小牛):
find . -name \*.mp3 -print0 | xargs -0 ffmpeg -i {} -c:a libfaac -vn {}.m4a
我正在尝试将一个完整的mp3目录(文件名中有空格)转换为m4a。找到xargs mac更改文件扩展名
要转换单个文件(这个工程):
ffmpeg -i Traffic.mp3 -c:a libfaac -vn Traffic.m4a
发生故障的命令(在OS X小牛):
find . -name \*.mp3 -print0 | xargs -0 ffmpeg -i {} -c:a libfaac -vn {}.m4a
为何使用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和追加.m4a
之前删除.mp3
或xargs
后sed
ding .mp3
延伸远离find
结果。我投最后的选择,因为它执行较少的进程(以及外壳是相当大的一个,虽然ffmpeg
会difinitely如此之大,在性能上的差异可以忽略不计)。
find . -name \*.mp3 | sed 's/\.mp3$//' | xargs -I{} ffmpeg -i {}.mp3 -c:a libfaac -vn {}.m4a
find . -name '*.mp3' -type f -exec bash -c 'ffmpeg -i "$0" -c:a libfaac -vn "${0%.mp3}.m4a"' {} \;
找到-name \ * MP3 -exec的ffmpeg -i {} -c:一个libfaac -vn {} .M4A \; 找到:非法选项 - n 用法:find [-H | -L | -P] [-EXdsx] [-f路径]路径... [表达式] find [-H | -L | -P] [-EXDSx] -f path [path ...] [expression] – brakertech
奇怪的是,路径显然是必需的。所以点再次回来,编辑。在Gnu中找到路径并不是必需的,'.'是默认的。 – Palec
''find' +'sed' +'xargs'带有'\ 0'分隔的文件名是不可移植的。只有Gnu sed可以处理'\ x0',AFAIK。在这种情况下,即使在Gnu版本中,AWK也是无用的。 POSIX完全不支持'\ 0'作为记录分隔符,甚至不支持'find'和'xargs'。 – Palec