使用FFMPEG转换多个文件后获得正确的文件扩展名

时间:2019-05-15 14:52:41

标签: bash macos find

我有一个将*.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的文件,扩展名之前完全没有任何内容。

我在做什么错了?

1 个答案:

答案 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 更准确地说,“在遵守命令行长度限制的同时,尽可能少的次数”。