この(拡張された)ワイルドカードが除外したいファイル名と一致するのはなぜですか?

この(拡張された)ワイルドカードが除外したいファイル名と一致するのはなぜですか?

なぜ?「myscript.txt」コマンドを実行すると、次のように表示されます。

$ ls !(my)*.txt
myscript.txt
hey.txt

$ ls !(my)*.txt同様に、bashはandをどのように解釈しますか$ ls !(my*).txt

ベストアンサー1

!(my)*.txtmyscript.txtだからマッチ

  • !(my)空の文字列の一致
  • *マッチmyscript
  • .txtマッチ.txt

!(my)空の文字列と一致するmyscriptか...と一致します。)*!(my)m*yscript

!(my*).txt.txtで終わるがで始まらないファイル名を一致させるには、これを行う必要がありますmy

これは!(*)ksh関連の演算子です。オプションがオンのbash場合にのみ、そのオプションがオンの場合にのみ、そのオプションもサポートされます。extglobzshkshglob

zshまた、独自のextendedglobsと^否定演算子があります。~ とは別に/まさかオペレーター:

set -o extendedglob
ls -ld -- (^my*).txt
ls -ld -- *.txt~my*

これとは別に/まさか演算子は、ksh93次の方法で実装できます。

ls -ld -- @(*.txt&!(my*))

または、bash -O extglob以前のバージョンのkshで使用

ls -ld -- !(!(*.txt)|my*)

ただし、glob全体のパターンの最終フィルタとして使用される演算子zshとは異なりますが、globの個々のパスコンポーネントでのみ機能できます(拡張子を除く)。~!(...)@(...)*/b*~f*rfoo/bar*/b*

おすすめ記事