Por que excluir excluir usando! não funciona em zsh?

2

Eu tenho 10 arquivos no diretório atual:

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

Eu quero remover todos os arquivos, exceto 2test e 3test , mas eu executo o comando rm !(2test|3test) não funciona. Eu recebo o seguinte erro:

zsh: no matches found: !(2test|3test)
    
por Aaron Shen 01.12.2015 / 09:14

3 respostas

7
A sintaxe

!(pattern) is ksh glob, em zsh , você usa ^(pattern) para negar a correspondência quando extendedglob ativado:

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

Se você quiser usar a sintaxe ksh , será necessário ativar kshglob :

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

Você também pode usar o operador e não / exceto :

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

( *test arquivos, exceto aqueles que começam com 2 ou 3 ).

Além disso, a menos que a opção nobareglobqual esteja ativada ou você use | s dentro deles, os operadores de agrupamento (...) glob em conflito entrarão em conflito com qualificadores glob. Por exemplo, em !(foo) ou ^(foo) , o foo seria tratado como um qualificador glob. Você precisaria de ^foo ou !(foo)(#q) (o (#q) adiciona um qualificador glob não-nulo (explícito)).

    
por 01.12.2015 / 09:26
6

Quando você usa setopt extendedglob , pode usar ^(2test|3test) para remover todos os arquivos, exceto 2test e 3test :

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

! é usado pelo bash, no entanto, o zsh usa ^ .

    
por 01.12.2015 / 09:28
0

começando com um zsh limpo (vazio)

 zsh -f 
 setopt extendedglob
 touch {1..10}test
 rm ^(2|3)test(.)
    
por 01.12.2015 / 18:09

Tags