私は似たようなことをしたい:
$ convert [a,b,c,d,e].png -resize 50% <current_match>_half.png
どうすればいいですか?現在、一致を保存する変数はありますか?ドキュメントに何も見つかりませんが、間違ったキーワードを探している可能性があります。
たぶん私がこれができると思ったがxargs
、私もそれを知ることはできない。
答え1
ImageMagickツールにはワイルドカード機能が制限されています。複数のファイル名またはリテラルワイルドカードを渡すと、シーケンス番号付き出力ファイルが生成されます。例:
convert [a-e].png -resize 50% half.png
などを作成しますhalf-0.png
。half-1.png
入力ファイル名を一致させるには、convert
ループ内で明示的にまたはツールを介して一度に1つずつ呼び出す必要があります。 (または後でファイルの名前を変更することはできますが、そうしても何の利点もありません。)ループ内でzshを使用できます。ファイル名の操作または文字列演算構造。
for i in [a-e].png; do
convert $i -resize 50% %{i:t}_half.png
done
これをスクリプトで使用している場合は、追加する必要があります。N
グローバル予選これにより、一致するファイルがない場合は、ワイルドカードパターンが空白に拡張されます。for i in [a-e].png(N); do …
Zshには、パターンに応じてファイル名を変更するツールが付属しています。zmv
。他の名前ベースの変換に使用できます。
autoload -U zmv
zmv -p convert -o '-resize 50%' '([a-e]).png' '${1}_half.png'
これらの名前パターンを作成する他の方法は次のとおりです。
zmv -p convert -o '-resize 50%' '([a-e])(.png)' '${1}_half$2'
zmv -p convert -o '-resize 50%' -w '[a-e].png' '${1}_half.png'
zmv -p convert -o '-resize 50%' '[a-e].png' '${f:t}_half.png'
エイリアスを作成して次のものを追加できます.zshrc
。
autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'
alias zconvert='zmv -p convert'
convert
下のラッパーは、すべてのオプションを内部引用符で渡す必要がある要件を排除するため、上記のエイリアスよりも少し優れています。オプションを渡す場合は、zmv
すべてのオプションの前に来る必要がありますconvert
。
zconvert () {
typeset -a zmv_options=
while [[ $1 = -[finqQsvwW] ]]; do
zmv_options+=($1)
done
zmv -p convert $zmv_options -o "$@[1,-3]" $@[-2] $@[-1]
}
答え2
globによって生成された名前のループでこれを書くことができます。
for f in [abcde].png; do
convert "$f" -resize 50% "${f%.png}"_half.png
done
注:上記の例には具体的な内容はありません。嘚;すべてのPOSIX互換シェルで動作する必要があります(スプリント、ケシ、強く打つ、嘚、等。 ;ほとんどすべての最新バージョンが含まれています。シェン)。
Stephen Chazerasも言及しました。嘚globがどのファイルとも一致できない場合は、他のデフォルトの動作があります。つまり、パターン自体を拡張の唯一の「結果」として使用するのではなく、エラーメッセージを表示します。この場合、この動作は他のシェルでも調整できますfailglob
。nullglob
強く打つ、特殊~(N)
グローバルプレフィックスケシとNOMATCH
のNULL_GLOB
オプション嘚)。