2016-06-19 11 views
2

私は.flacファイルを含むいくつかのサブディレクトリを持つディレクトリを持っています。私は一括して.mp3に変換したいです。パス名にはスペースが含まれています。今、私はこの複数のディレクトリにあるファイルをバッチ処理する

find . -type f -regex .*.flac -exec ffmpeg -i {} -c:a mp3 -b:a 320k \; 

のような何かをしたいしかし、問題があり、どのように私は、出力ファイル名をffmpegの与えるmp3ため{}と代替flacを使用することができますか? bashでは、変数置換${file%.flac}.mp3を使用できますが、ここでは適用できません。 sedベースのアプローチはfindでも動作しないようです。 これには簡単な解決法はありますか?

+1

Btw。 '* .flac'を引用してください。 – Cyrus

答えて

3

あなたbashを使用している場合、私はすべてのあなたの.flacファイルのリストに展開され、globstarを使用したい:

shopt -s globstar nullglob 
for file in **/*.flac; do 
    [[ -f $file ]] || continue 
    out_file=${file%.flac}.mp3 
    ffmpeg # your options here, using "$out_file" 
done 

.flacで終わる任意のディレクトリをスキップし[[ -f $file ]]チェック。もしあなたがそれらのどれも持っていなければ、おそらくこれをスキップすることができます。

また、nullglobシェルオプションを有効にしたので、ファイルに一致しないパターンは何も展開されないためループは実行されません。

+0

あなたは私のプラスワンの ':)'に値するでしょう。 –

2

実際にfindを使用したい場合(たとえば、Bashのアンティークバージョンでは古くなっていて、globstarは利用できません - Tom Fenechのソリューションはオプションではありません)、あなたはシェルで置換を行います。

find . -name '*.flac' -type f -exec sh -c 'ffmpeg -i "$1" -c:a mp3 -b:a 320k "${1%.flac}.mp3"' dummy {} \; 

sh -cはその最初の引数を実行し、サブシーケンスの引数は0から始まる位置パラメータに設定されている:標準的な方法は次のようになります。だから私はダミーのパラメータを入れた(と私はそれをdummyと呼んだが、他に何かできる)。

find-nameには、引数*.flacを引用符で囲む必要があります。何らかの理由であなたの投稿を編集し、-name述語を-regex述語に置き換えました。それは本当に役に立たず、依然として引数を引用する必要があります。

+0

"sh -c" ffmpeg -i "$ 0" -c:mp3 -b:320k "$ {1%.flac} .mp3" '{} \;'と書くことはできませんか? –

+1

@mona_sax:nopeその場合、位置パラメータ '$ 1'が設定されていないので、それはあまり有効ではありません! 'sh -c 'ffmpeg -i" $ 0 "-c:mp3 -b:320k" $ {0%.flac} .mp3 "{} \;'これは完全に有効です。 –

+1

うん、はい!私があなたが指摘したことを意味しているわけではありません。 :)。ダミー変数の使用を避けたかったのです。これは確かにエレガントな1つのライナーです:) +1 –

関連する問題