2016-04-17 12 views
0

私はオーディオファイル(.flac - > .m4a)のディレクトリを迅速かつ適切なファイル名で処理できるように、ベースネーム(ファイル拡張子なし)を取得しようとしています。ZSH:forループのベースネームを取得

だから、これは動作します:

for i in *.flac;do ffmpeg -i $i -c:a libfdk_aac -vbr 3 $i.m4a; done 

をしかし、それは、このようなようなファイルを私に残します:私がやりたい何 audiofile.flac.m4a

は単に「オーディオファイル」の部分をつかむです

for i in *.flac;do ffmpeg -i $i.flac -c:a libfdk_aac -vbr 3 $i.m4a; done 

しかし、私は修飾子を理解していない:ファイル名のこれが動作するように(明らかに「:T」?修飾子は私に結果を得る可能性があります)、または方法については上の変数を定義しますループ(各ファイル)。また、私はBASHでこれを行う方法の例がたくさんあることを知っていますが、私はzshで動作するものを探しています。

アイデア?

ありがとうございます!

答えて

1

zshには、Modifiers from History ExpansionParameter Expansionsとすることができます。 ${name:modifier}. The R modifier removes the extension, i.e. everything from - including - the last .`ファイル名の末尾に:

for i in *.flac; do 
    ffmpeg -i $i -c:a libfdk_aac -vbr 3 ${i:r}.m4a 
done 

注:修飾子rは、「.flac」だけでなく、任意の拡張子を削除します。各修飾子は、コロンが先行しています。

よりポータブル(読み:任意のPOSIX準拠のシェルで動作するはず)と特定の溶液はnameの値の末尾からpatternに一致最小の文字列を削除しますパラメータ拡張${name%pattern}を使用することであろう。 patternnameの値の終わりと一致しない場合、値はそのまま返されます。

for i in *.flac; do 
    ffmpeg -i $i -c:a libfdk_aac -vbr 3 ${i%.flac}.m4a 
done 

これは、特に、ファイル名の末尾からのみ「.flac」を削除します。

関連する問題