zshで「現在のグローブ」を入手する方法

zshで「現在のグローブ」を入手する方法

私は似たようなことをしたい:

$ 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.pnghalf-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]
}

おすすめ記事