zsh: excluindo arquivos de um padrão

14

Digamos que eu tenha os seguintes arquivos:

|-- bar
'-- foo
    |-- type_A_1
    |-- type_A_2
    |-- type_B_1
    |-- type_B_2
    |-- type_B_xx
    |-- type_B_xx
    '-- something_else

Eu achei o seguinte comando

print -l foo/*~{type_B*}

imprime tudo em foo exceto coisas que começam com type_B , mas não, em vez disso, imprime tudo em foo:

foo/type_A_1
foo/type_A_2
foo/type_B_1
foo/type_B_2
foo/type_B_xx
foo/something_else

Eu também tentei print -l foo/*~type_B e consegui a mesma coisa.

Como o curinga% da exceção~ funciona no zsh?

    
por Amelio Vazquez-Reina 22.02.2012 / 17:06

2 respostas

9

Você precisa incluir o diretório na exceção: print -l foo/*~foo/type_A* ou print -l foo/*~{foo/type_A*} .

Se você quiser, pode substituir o diretório por um curinga:   print -l foo/*~*/type_A*

    
por 22.02.2012 / 17:14
26

zsh tem o operador ^ glob quando o EXTENDED_GLOB está ativado. Parece o ajuste perfeito para a sua situação declarada:

setopt extendedglob
print -rl foo/^type_A*

Significa "corresponder a qualquer coisa, exceto o que corresponde ao seguinte padrão", mas seu efeito é limitado à parte do padrão entre barras, ou entre o início do padrão e a primeira barra, ou (como neste caso) entre a última barra e o fim do padrão.

Você pode visualizar as opções zsh ativadas atualmente com:

setopt

E desative EXTENDED_GLOB com:

unsetopt extendedglob
    
por 23.02.2012 / 11:59