为什么 rm 排除使用 !在 zsh 中不起作用?

为什么 rm 排除使用 !在 zsh 中不起作用?

我当前目录中有 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

另外,除非启用该选项或者在其中nobareglobqual使用s,否则尾随glob 分组运算符会与 glob 限定符冲突。例如,在or中,将被视为全局限定符。您需要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(.)

相关内容