ZSH: globalização recursiva com .directories

7

Eu pensei que o padrão glob:

**/(*|.*)

representaria todas as pastas e arquivos começando com dot ( . ) ou não, mas ignoraria diretórios no diretório atual que começam com . .

Qual é o padrão glob que significa:

every file and folder that may or may not start with . on the current and deeper folders

Além disso: Como posso excluir uma pasta específica (ou melhor ainda, um subpadrão glob) de um padrão glob recursivo como o acima?

Eu tentei o seguinte para excluir a pasta .hg do nível atual (mas incluir outras pastas iniciando com o caractere . ):

**~.hg/*

mas não foi recursivamente para diretórios mais profundos.

    
por Amelio Vazquez-Reina 19.12.2011 / 00:35

2 respostas

10

A maneira mais fácil de fazer um padrão glob corresponder aos arquivos de pontos é usar o D glob qualificador .

**/*(D)

A precedência de ~ é menor que / , portanto, **~.hg/* é ** menos as correspondências de .hg/* . Mas ** é especial apenas se for antes de um / , portanto, ele corresponde aos arquivos no diretório atual. Para excluir .hg e seu conteúdo, você precisa

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

Note que o zsh ainda irá percorrer o diretório .hg , o que pode levar algum tempo; essa é uma limitação de ** : você não pode definir uma lista de exclusão diretamente nesse nível.

    
por 19.12.2011 / 01:13
4

**/*(D) (abreviação de (*/)#*(D) ) inclui dotfiles e dotdirs como já foi dito.

Se você quiser excluir .hg diretórios em todos os níveis, é necessário:

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

(você precisa de setopt extendedglob para o operador ^ )

Como já foi dito, o ~ pattern, excluirá as entradas (com base em se a expansão completa corresponde ao "padrão" depois que a lista foi gerada, portanto, não a impedirá de entrar em subdiretórios).

    
por 28.08.2012 / 22:42

Tags