Linuxでディレクトリ内のflacをすべてmp3に変換

メモ。Ubuntu Linux使ってたときにFLAC化してたファイルをiPhoneで聞けるMP3に変換したい。


flac/アーティスト名/アルバム名/
というディレクトリがたくさんあってさらにその下にflacファイルと、ジャケット画像のjpgや歌詞のtxtファイルがあったりする。
flacを全部mp3に変換したい。


最初、以下のコマンドでやろうとした

ubuntu:progd% find . -name "*.flac" -exec flac --decode --stdout {} | lame - {}.mp3 \;
find: missing argument to `-exec'
lame: excess arg ;

パイプ以降はexecの引数とされないのでは?

find . -name "*.flac" -exec "flac --decode --stdout {} | lame - {}.mp3" \;

No such file or directory っていわれる

ubuntu:progd% find . -name "*.flac" -exec "flac --decode --stdout {} | lame - {}.mp3 \;"
find: missing argument to `-exec'

だめ。

find . -name "*.flac" -print0 | xargs -0 -I{} flac --decode --stdout {} | lame - {}.mp3

LAMEが{}.mp3って名前で書き出してしまうしなんかファイルひとつ処理した後止まる


シェルのforループは名前に空白を含むファイルをうまく処理する方法がわからず。

ubuntu:progd% cat flac2mp3.sh
#!/bin/sh

echo decoding: $1
flac --decode --stdout "$1" | lame - "$1".mp3

ubuntu:progd% find . -name "*.flac" -exec ./flac2mp3.sh {} \;

結局こうした。


追記
ファイルの拡張子が .flac.mp3 になってしまったので、perlワンライナーというものを試した

find . -name "*.mp3" | perl -lne '$o=$_; s/\.flac//; rename $o,$_;'