zsh: excluindo arquivos de um padrão

18

Digamos que tenho 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 pensei o seguinte comando

print -l foo/*~{type_B*}

imprimiria tudo em menos, foo exceto as coisas que começam com type_Bmas não o faz; 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_Be consegui a mesma coisa.

Como o curinga de exceção ~funciona no zsh?

Amelio Vazquez-Reina
fonte

Respostas:

10

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

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

jofel
fonte
Obrigado! Sobre o segundo padrão, você se importa de explicar como o padrão foo/*~*/type_A*funciona? O segundo se *expande para todas as pastas do diretório de trabalho ou é inteligente o suficiente para se expandir somente para foo?
Amelio Vazquez-Reina
@roseck Como parece muito rápido (por exemplo, quando você executa print *~**/*no /diretório), suponho que ele primeiro expanda o primeiro padrão e remova todas as correspondências que se ajustem ao padrão de exclusão.
Jofel
2
@roseck ~é puramente textual, a parte antes da expansão se ~expande como sempre, e a parte após a remoção das correspondências. Ajofel Um teste melhor seria print /**/*~*: você pode observar que ele atravessa a árvore inteira, mesmo que acabe imprimindo nada.
Gilles 'SO- stop be evil'
Eu pensei que ele queria excluir type_B, mas incluir type_A.
systemovich
A resposta certa está abaixo
aryndin 28/01
30

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

setopt extendedglob
print -rl foo/^type_A*

Significa "combinar qualquer coisa, exceto o que corresponde ao padrão a seguir", 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. barra e o fim do padrão.

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

setopt

E desative EXTENDED_GLOB com:

unsetopt extendedglob
Chris Johnsen
fonte