zsh: escludendo i file da un modello


18

Di 'che ho i seguenti file:

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

Ho pensato al seguente comando

print -l foo/*~{type_B*}

stamperebbe tutto sotto foo tranne le cose che iniziano con type_Bma non lo fa, invece stampa tutto sotto foo:

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

Ho anche provato print -l foo/*~type_Be ottenuto la stessa cosa.

Come funziona il jolly delle eccezioni ~in zsh?

Risposte:


10

È necessario includere la directory nell'eccezione: print -l foo/*~foo/type_A*o print -l foo/*~{foo/type_A*}.

Se lo desideri, puoi sostituire la directory con un carattere jolly: print -l foo/*~*/type_A*


Grazie! Circa il secondo modello, ti dispiace che spiega come il modello foo/*~*/type_A*funziona? Il secondo si *espande in tutte le cartelle nella directory di lavoro o è abbastanza intelligente da espandersi solo in foo?
Amelio Vazquez-Reina

@roseck Perché sembra molto veloce (ad esempio quando corri print *~**/* nella /directory), presumo che prima espanda il primo modello e quindi rimuova tutte le corrispondenze che si adattano al modello di esclusione.
jofel,

2
@roseck ~è puramente testuale, la parte prima dell'espansione si ~espande come sempre, quindi la parte dopo si spoglia. @Jofel Un test migliore sarebbe print /**/*~*: puoi osservare che attraversa l'intero albero, anche se finisce per non stampare nulla.
Gilles 'SO- smetti di essere malvagio'

Pensavo che volesse escludere type_B ma includere type_A.
systemovich

La risposta giusta è sotto
aryndin il

30

zsh ha l' ^operatore glob quando EXTENDED_GLOB è attivo. Sembra la soluzione perfetta per la tua situazione dichiarata:

setopt extendedglob
print -rl foo/^type_A*

Significa "abbina qualsiasi cosa, tranne ciò che corrisponde al modello seguente", ma il suo effetto è limitato alla porzione del modello tra le barre, o tra l'inizio del modello e la prima barra, o (come in questo caso) tra l'ultimo barra e la fine del modello.

Puoi visualizzare le opzioni zsh attualmente abilitate con:

setopt

E disabilita EXTENDED_GLOB con:

unsetopt extendedglob
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.