シェルパターンマッチングロジック

シェルパターンマッチングロジック

2つの論理的な違いは何ですか

  1. ll -d !(.*@(ry|rc))
  2. ll -d !(.*{ry,rc})

私のホームディレクトリでそれを使用すると、2番目は一致し、1.bash_history番目.xinputrcは一致しません。

メモ:

$ shopt extglob
extglob         on

ベストアンサー1

ll -d -- !(.*{ry,rc})

ワイルドカードと中かっこ拡張を組み合わせます。まず、これを次のように拡張します。

ll -d -- !(.*ry) !(.*rc)

フレーズは個別に展開されます。最初の一致.inputrcbash -O extglobしかし、kshその文法のソースやシミュレーションzshでは一致しませんksh。これは隠しファイルであり、ドットファイルは明示的に要求されていないためです)。

これらのglobがどのファイルとも一致しないディレクトリでこれを確認できます(この場合、globは変更されずに残り、bashこれは解決できるもう1つのバグ機能ですshopt -s failglob)。たとえば、読み取り権限のないディレクトリの途中で:

$ chmod a-r .
$ bash -O extglob -c 'echo ll -d -- !(.*{ry,rc})'
ll -d -- !(.*ry) !(.*rc)

そして

ll -d -- !(.*@(ry|rc))

それは群れです。

ここでは、次のこともできます。

ll -d -- !(.*r[cy])

または:

ll -d -- !(.*rc|.*ry)

bashこの拡張にはおよびも含まれています...そのファイルを除外したいのですが(おそらくそうであると確信しています)、隠されたファイルは引き続き含めるには、次のことを行う必要があります。

shopt -s dotglob
ll -d -- !([.]*@(rc|ry))

または、明示的に除外することもできます。

ll -d -- !(.*@(rc|ry)|.|..)

では、zsh -o extendedglob次の操作を行います。

ll -d -- ^.*(rc|ry)(D)

(このglobに対してのみ有効になります(D))。dotglob

おすすめ記事