zshスクリプト - ファイル名を生成するときにパターンを一致させない方法は?

zshスクリプト - ファイル名を生成するときにパターンを一致させない方法は?

私は現在一連のディレクトリを循環しようとしていますが、興味のあるディレクトリだけを循環しようとしています。

$ ls -d */
cfdpost_statefiles/     p050L0260/  p050L0510/  p060L0390/  p070L0260/  p070L0510/  p092L0390/  p097L0260/  p110L0390/  p131L0325/  p150L0510/  profiles/
ERCOFTAC_TestSettings/  p050L0390/  p060L0260/  p060L0510/  p070L0390/  p084L0510/  p094L0325/  p100L0510/  p125L0510/  p136L0260/  p162L0260/  settings/

p###*で始まるディレクトリ以外のすべてのディレクトリを一致させたい。p125p150

パターンをパイプすると、次のような結果が得られます。

$ for dir in ./p(125|150)*(/); echo $dir
./p125L0510
./p150L0510

ただし、使用しようとすると^表示されます。ドキュメントから:

$ for dir in ./p^(125|150)*(/); echo $dir
zsh: no matches found: ./p^(125|150)*(/)

進行方法のアイデアはありますか?

答え1

EXTENDED_GLOBzshの設定オプションが必要です。

設定されていることを確認するには、以下を実行してsetopt設定されたオプションを表示します。

$ setopt | grep glob
extendedglob

設定されていない場合を実行しますsetopt extended_glob

注: これにより~^および#拡張できなくなります。


私の問題はシェルでこのオプションを設定しましたが、スクリプトでforループを実行しています。スクリプトは実行用に独自のシェルを起動するため、このオプションは設定されません。

setopt extendedglobこの特定の問題を解決するには、スクリプト自体を挿入してください。

関連情報