zsh: exclusion de fichiers d'un modèle

18

Disons que j'ai les fichiers suivants:

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

Je pensais que la commande suivante

print -l foo/*~{type_B*}

imprimerait tout sous foo sauf les choses qui commencent par type_Bmais ce n'est pas le cas, à la place il imprime tout sous foo:

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

J'ai aussi essayé print -l foo/*~type_Bet obtenu la même chose.

Comment fonctionne le caractère générique d'exception ~dans zsh?

Amelio Vazquez-Reina
la source

Réponses:

10

Vous devez inclure le répertoire dans l'exception: print -l foo/*~foo/type_A*ou print -l foo/*~{foo/type_A*}.

Si vous le souhaitez, vous pouvez remplacer le répertoire par un caractère générique: print -l foo/*~*/type_A*

jofel
la source
Merci! À propos du deuxième motif, voulez-vous expliquer comment fonctionne le motif foo/*~*/type_A*? Le second se *développe-t-il dans tous les dossiers du répertoire de travail ou est-il suffisamment intelligent pour se développer uniquement foo?
Amelio Vazquez-Reina
@roseck Parce qu'il semble vraiment rapide (par exemple lorsque vous exécutez print *~**/*dans le /répertoire), je suppose qu'il développe d'abord le premier modèle, puis supprime toutes les correspondances qui correspondent au modèle d'exclusion.
jofel
2
@roseck ~est purement textuel, la partie avant l' ~expansion comme toujours, puis la partie après supprime les correspondances. @Jofel Un meilleur test serait print /**/*~*: vous pouvez observer qu'il parcourt tout l'arbre, même s'il finit par ne rien imprimer.
Gilles 'SO- arrête d'être méchant'
Je pensais qu'il voulait exclure type_B mais inclure type_A.
systemovich
La bonne réponse est ci
aryndin
30

zsh a l' ^opérateur glob lorsque EXTENDED_GLOB est activé. Cela semble être parfaitement adapté à votre situation:

setopt extendedglob
print -rl foo/^type_A*

Cela signifie «faire correspondre n'importe quoi, sauf ce qui correspond au modèle suivant», mais son effet est limité à la partie du modèle entre les barres obliques, ou entre le début du modèle et la première barre oblique, ou (comme dans ce cas) entre le dernier barre oblique et fin du motif.

Vous pouvez afficher les options zsh actuellement activées avec:

setopt

Et désactivez EXTENDED_GLOB avec:

unsetopt extendedglob
Chris Johnsen
la source