我有一个将*.flac
转换为*.mp3
的脚本。转换会按预期进行,但是文件始终以扩展名*.flac.mp3
结束,而不仅仅是扩展名*.mp3
。
find . -name "*.flac" -exec ffmpeg -i {} -vsync 0 -codec:a libmp3lame -qscale:a 0 -map_metadata 0 -id3v2_version 3 {}.mp3 \;
我已经尝试过将${i%.*}.mp3
放在输出字段中,但这只会导致创建名为.mp3
的文件,扩展名之前完全没有任何内容。
我在做什么错了?
答案 0 :(得分:0)
{}
是find
找到的完整文件名,包括扩展名.flac
。要对其进行操作,可以在-exec
中调用shell:
find . -name '*.flac' \
-exec bash -c '
for f; do
ffmpeg -i "$f" -vsync 0 -codec:a libmp3lame -qscale:a 0 \
-map_metadata 0 -id3v2_version 3 "${f%.flac}".mp3
done
' _ {} +
这使用-exec <cmd> {} +
语法运行<cmd>
一次 1 ,并附加所有文件;该命令本身的格式为
bash -c 'for f; do <something>; done' _
其中for f
循环作为参数提供的所有文件; _
是一个虚拟参数,将在$0
中用作bash -c
。
1 更准确地说,“在遵守命令行长度限制的同时,尽可能少的次数”。