音楽形式のカタログファイルをOgg opus形式に変換できるzshスクリプトはありますか?これファイル名にスペースが含まれています。。
たとえば、ディレクトリには拡張子が* .wmaのファイル10個が含まれています。
*.wav
以下を使用してファイルを形式に変換するffmpeg -i filename.wma filename.wav
ファイルは*.wav
本番環境で使用するために変換されます。opusenc --bitrate 160 filename.wav filename.opus
修正する:ffmpeg -i filename.wma -c:a libopus -b:a 128k filename.opus
1つのコマンドにファイルを変換する
部分的に動作するスクリプトは、空白があっても、現在のディレクトリで.wmaから.wavまでのファイル名を処理します。ただし、.wav
*.wma ファイル拡張子を置き換える代わりに拡張子が追加されます。
スクリプトはというファイルに追加され、convert
ファイルは実行可能になります。
IFS=$'\n'
for x in *.wma ; do
echo $x
ffmpeg -i "$x" $x.wav
done
試してみてくださいZsh修飾子ファイル拡張子を次のように置き換えます。 (${x:e}".wav
ilkkachuの提案の後にこれを試しました${x:r}".wav
)
IFS=$'\n'
for x in *.wma ; do
ffmpeg -i "$x" "${x:e}".wav
done
名前付きファイルからそれを呼び出すと、convert
次のエラーが返されます。
./convert: 3: Bad substitution
でも同じエラーが発生します。
IFS=$'\n'
for x in *.wma ; do
ffmpeg -i "$x" "${x:r}".wav
done
構文が書くのが非常に簡単ではない場合、またはファイル名にスペースが含まれている場合、修飾子は機能しないようです。またはまだzshについて学ぶことがたくさんあります:)
Zshでファイル拡張子を置き換える正しい方法はあります(ファイル名にスペースが含まれている場合)
ありがとうございます。
ベストアンサー1
sh
問題は、スクリプトをinではなくzsh
inとして解釈することですが、zsh
ここでは次のように使用できますzmv
。
#! /bin/zsh -
autoload zmv
zmv -P ffmpeg -o -i './(*).wma' './$1.wav'
zmv
通常、バッチの名前変更が行われますが、バッチコピー/リンクまたはすべてのタスクのバッチ操作を実行することもできます(タスクを実行するコマンドの名前が指定されている場合)。何もない。
タスクを実行する前に実行するいくつかの保護措置(ターゲットファイルが存在しないか、または両方のソースファイルが同じターゲットにマップされていることを確認)の利点を享受できます。
また。./
-
ffmpeg
とにかく、IFSトークン化を使用せず(コマンドの置き換えとzshでのみ実行されます)、配列要素をの最初の要素に関連付けるなどのものを使用しないIFS=$'\n'
ため、コードでは何も実行されません。 //グローバル変更を実行する代わりに、パラメータ拡張フラグを使用して分割または結合することをお勧めします。また、改行はファイル名のすべての文字で有効です。$=param
"$array[*]"
$IFS
zsh
s[sep]
f
0
j[sep]
$IFS