zshでrmを使用して除外しないのはなぜですか?

zshでrmを使用して除外しないのはなぜですか?

現在、ディレクトリに10個のファイルがあります。

10test
1test
2test
3test
4test
5test
6test
7test
8test
9test

2testを除くすべてのファイルを削除したいが、3test実行したコマンドはrm !(2test|3test)機能しません。次のエラーが発生します。

zsh: no matches found: !(2test|3test)

答え1

!(pattern)有効な場合、一致を無効にするために使用できるkshglob構文。zsh^(pattern)extendedglob

setopt extendedglob
print -rl -- ^(2test|3test)

構文を使用するには、ksh以下を有効にする必要がありますkshglob

setopt kshglob
print -rl -- !(2test|3test)

また、使用することができますまさか/とは別にオペレーター:

setopt extendedglob
print -rl -- *test~[23]*

*testまたはで始まるファイルを除く)。23

また、このオプションが有効になっているかsが使用されていない限り、後続のnobareglobqualglobグループ化演算子はglob修飾子と競合します。たとえば、or はグローバル修飾子として扱われます。または(プライベート(明示的)グローバル修飾子を追加)が必要です。|(...)!(foo)^(foo)foo^foo!(foo)(#q)(#q)

答え2

以下を除くすべてのファイルを削除setopt extendedglobできます。^(2test|3test)2test3test

# setopt extendedglob
# touch {1..10}test
# rm ^(2test|3test)
# ls
2test 3test

!bashでは使用されますが、zshでは使用されません^

答え3

きれいな(空の)zshで始めてください。

 zsh -f 
 setopt extendedglob
 touch {1..10}test
 rm ^(2|3)test(.)

関連情報