ZSHでファイル拡張子を繰り返す方法は?

ZSHでファイル拡張子を繰り返す方法は?

このBASH構造に対応するZSHを探しています。

for file in *.{abc,def,ghi}; do #loop through all files with the extensions .abc, .def and .ghi

ZSHの同様の設定が見つかりません。それとも違うかもしれませんか?

ベストアンサー1

次のファイルがあるとします。foo.abc、、、bar.abcqux.ghibashでは、ループ本文はfoo.abc、、(リテラルを使用) bar.abc、およびを使用して4回実行されます。 zshでデフォルトオプションを使用すると、ループはまったく実行されませんが、エラーが発生します*.def*qux.ghi

zsh:1: no matches found: *.def

拡張されていないワイルドカードパターンでループが実行されないようにし、既存のファイル(存在する場合)でループを実行するには、次のように追加します。Nグローバル予選

for file in *.{abc,def,ghi}(N); do …

また、使用することができます|オペレーターしたがって、複数のスキーマの代わりに1つのスキーマを持つことになります。 (中括弧はワイルドカードパターンではなく、ワイルドカードが構文解析される前に発生するリテラル文字列拡張のみです。つまり、*.{abc,def,ghi}(N)の略語です*.abc(N) *.def(N) *.ghi(N)。)

for file in *.(abc|def|ghi)(N); do …

それでもNglob修飾子が必要です。それ以外の場合、一致するファイルが存在しない場合はエラーが発生します。

Nglob修飾子なしで行うことができます。null_globこのオプションをオンにしてくださいsetopt null_glob)。これは通常スクリプトで意味があります。 Bashでは、shopt -s nullglobアンローリングモードでループ本体が実行されないようにするには、同様のオプション()を有効にする必要があります。

おすすめ記事