現在、ディレクトリに10個のファイルがあります。
10test
1test
2test
3test
4test
5test
6test
7test
8test
9test
2test
を除くすべてのファイルを削除したいが、3test
実行したコマンドはrm !(2test|3test)
機能しません。次のエラーが発生します。
zsh: no matches found: !(2test|3test)
答え1
!(pattern)
有効な場合、一致を無効にするために使用できるksh
glob構文。zsh
^(pattern)
extendedglob
setopt extendedglob
print -rl -- ^(2test|3test)
構文を使用するには、ksh
以下を有効にする必要がありますkshglob
。
setopt kshglob
print -rl -- !(2test|3test)
また、使用することができますまさか/とは別にオペレーター:
setopt extendedglob
print -rl -- *test~[23]*
(*test
またはで始まるファイルを除く)。2
3
また、このオプションが有効になっているかsが使用されていない限り、後続のnobareglobqual
globグループ化演算子はglob修飾子と競合します。たとえば、or はグローバル修飾子として扱われます。または(プライベート(明示的)グローバル修飾子を追加)が必要です。|
(...)
!(foo)
^(foo)
foo
^foo
!(foo)(#q)
(#q)
答え2
以下を除くすべてのファイルを削除setopt extendedglob
できます。^(2test|3test)
2test
3test
# 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(.)