ZSH: Glissement récursif avec .directories

Je pensais au motif glob:

**/(*|.*) 

représenterait tous les dossiers et files commençant par dot ( . ) ou non, mais il saute les directorys dans le directory courant qui commence par . .

Quel est le motif glob qui signifie:

chaque file et dossier qui peuvent ou ne peuvent pas commencer par . sur les dossiers actuels et plus profonds

En outre: Comment puis-je exclure un dossier spécifique (ou même mieux, un sous-model glob) d'un schéma globulaire récursif tel que ci-dessus?

J'ai essayé ce qui suit pour exclure le dossier .hg du niveau actuel (mais inclure d'autres dossiers commençant par le caractère . ):

 **~.hg/* 

mais il n'est pas allé récursivement dans des directorys plus profonds.

La façon la plus simple de créer un file de points globaux correspond à l'utilisation du qualificatif D glob .

 **/*(D) 

La précédence de ~ est inférieure à / , donc **~.hg/* est ** less les correspondances pour .hg/* . Mais ** est seulement spécial si c'est avant un / , donc ici, il correspond aux files du directory courant. Pour exclure .hg et son contenu, vous avez besoin

 **/*~.hg~.hg/*(D) 

Notez que zsh continuera à parcourir le directory .hg , ce qui peut prendre du time; c'est une limitation de ** : vous ne pouvez pas définir une list d'exclusion directement à ce niveau.

**/*(D) (abréviation de (*/)#*(D) ) inclut les dotfiles et les dotdirs comme déjà dit.

Si vous souhaitez exclure les directorys .hg à tous les niveaux, vous avez besoin de:

 (^.hg/)#^.hg(D) 

(vous avez besoin de setopt extendedglob pour l'opérateur ^ )

Comme nous l'avons déjà dit, le ~ pattern exclut les inputs (selon que leur extension complète correspond à "pattern" après que la list a été générée, ne l'empêchera pas de descendre dans les sous-dossiers).