我当前目录中有 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
另外,除非启用该选项或者在其中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(.)