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]
}

答え2

globによって生成された名前のループでこれを書くことができます。

for f in [abcde].png; do
    convert "$f" -resize 50% "${f%.png}"_half.png
done

注:上記の例には具体的な内容はありません。;すべてのPOSIX互換シェルで動作する必要があります(スプリントケシ強く打つ、等。 ;ほとんどすべての最新バージョンが含まれています。シェン)。

Stephen Chazerasも言及しました。globがどのファイルとも一致できない場合は、他のデフォルトの動作があります。つまり、パターン自体を拡張の唯一の「結果」として使用するのではなく、エラーメッセージを表示します。この場合、この動作は他のシェルでも調整できますfailglobnullglob強く打つ、特殊~(N)グローバルプレフィックスケシNOMATCHNULL_GLOBオプション)。

関連情報