zsh: excluir archivos de un patrón

18

Digamos que tengo los siguientes archivos:

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

Pensé el siguiente comando

print -l foo/*~{type_B*}

imprimiría todo debajo, foo excepto las cosas que comienzan con type_Bpero no lo hace, en su lugar, imprime todo debajo de foo:

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

También intenté print -l foo/*~type_By obtuve lo mismo.

¿Cómo funciona el comodín de excepción ~en zsh?

Amelio Vazquez-Reina
fuente

Respuestas:

10

Debe incluir el directorio en la excepción: print -l foo/*~foo/type_A*o print -l foo/*~{foo/type_A*}.

Si lo desea, puede reemplazar el directorio por un comodín: print -l foo/*~*/type_A*

jofel
fuente
¡Gracias! Sobre el segundo patrón, ¿te importaría explicar cómo funciona el patrón foo/*~*/type_A*? ¿El segundo se *expande a todas las carpetas del directorio de trabajo, o es lo suficientemente inteligente como para expandirlo foo?
Amelio Vazquez-Reina
@roseck Debido a que parece muy rápido (por ejemplo, cuando ejecuta print *~**/*en el /directorio), supongo que primero expande el primer patrón y luego elimina todas las coincidencias que se ajustan al patrón de exclusión.
jofel
2
@roseck ~es puramente textual, la parte antes de que se ~expanda como siempre lo haría, luego la parte posterior se quita las coincidencias. Ofjofel Una mejor prueba sería print /**/*~*: puede observar que atraviesa todo el árbol, incluso si no imprime nada.
Gilles 'SO- deja de ser malvado'
Pensé que quería excluir type_B pero incluir type_A.
systemovich
La respuesta correcta está abajo
aryndin
30

zsh tiene el ^operador global cuando EXTENDED_GLOB está activado. Parece el ajuste perfecto para su situación declarada:

setopt extendedglob
print -rl foo/^type_A*

Significa "hacer coincidir cualquier cosa, excepto lo que coincida con el siguiente patrón", pero su efecto se limita a la parte del patrón entre barras, o entre el comienzo del patrón y la primera barra, o (como en este caso) entre las últimas barra oblicua y el final del patrón.

Puede ver las opciones de zsh actualmente habilitadas con:

setopt

Y deshabilita EXTENDED_GLOB con:

unsetopt extendedglob
Chris Johnsen
fuente