4

同様の状況でこれを行う例をいくつか見つけましたが、これはコマンドを逐語的に実行する以外のことを行う唯一のシェルスクリプトです。 <3を保持

MP4からオーディオをバッチリッピングしようとしています。このスクリプトは動作します:

for f in *.mp4; 
    ffmpeg -i "$f" -f mp3 -ab 192000 -vn "mp3s/$f.mp3"
done

しかし、ファイルはすべて .mp4.mp3 で終わります。どうすればmp4部分を取り除くことができますか?

4

2 に答える 2

11

バッシュを使用している場合

${f%%.mp4}

拡張子なしのファイル名が表示されます.mp4

次のように使用してみてください。

for f in *.mp4; do
    ffmpeg -i "$f" -f mp3 -ab 192000 -vn "mp3s/${f%%.mp4}.mp3"
done

do...そして、与えられた例のようにキーワードを忘れないでください。

説明

bash Manual( man bash) には次のように記載されています。

${parameter%word} ${parameter%%word}

一致するサフィックス パターンを削除します。パス名の展開と同様に、単語が展開されてパターンが生成されます。パターンが parameter の展開された値の末尾部分と一致する場合、展開の結果は、一致する最も短いパターン ( %'' case) or the longest matching pattern (the%%'' の場合) が削除された parameter の展開された値になります。parameter が @ または * の場合、パターン除去操作は各位置パラメーターに順番に適用され、展開は結果のリストになります。parameter が @ または * で添字付けされた配列変数である場合、パターン除去操作は配列の各メンバーに順番に適用され、展開は結果のリストになります。

これは、シェル変数に対して実行できる多くの文字列操作の 1 つにすぎません。それらはすべてParameter Expansionという名前で呼ばれます。

これは、bash マニュアルに記載されているセクション ラベルでもあります。したがってman bash /paramter exp、そこにすばやく移動する必要があります。`

于 2013-03-05T21:38:15.013 に答える