ZSH: 'ls * (.)' lista somente arquivos regulares, mas 'ls * (/)' não lista apenas diretórios

5

Não tenho certeza se estou usando o globing do ZSH corretamente, mas achei que ls *(/) apenas listaria os dirctories em pwd , mas não, ele lista todos os arquivos em todos os diretórios em pwd (recursivamente Eu tenho a declaração de esta lista de dicas úteis sobre zsh

O que seria certo globbing para listar exclusivamente os diretórios no meu caminho atual?

    
por Amelio Vazquez-Reina 01.09.2011 / 20:44

3 respostas

12

Eu suspeito que o problema não é o zsh globbing, mas o comportamento padrão ls , que quando dado um argumento de diretório lista o conteúdo do diretório.

Sugiro tentar

ls -d -- <your-glob-here>

A melhor maneira de testar seus globs é com

printf '%s\n' <glob>
    
por 01.09.2011 / 21:52
2

No entanto, outra maneira de alcançar isso é

 print *(/)

ou

 echo *(/)

Update1

Um bit mais versão correta (como notado por @ Stéphane Chazelas) seria

print -rl -- *(/) 

ou

echo -E - *(/)

para cuidar de espaços (-l), seqüências de escape (-r / -E) e hífens principais (- / -) dentro de nomes de arquivos.

Update2

Ainda ainda mais versão correta é print -rN que adicionalmente cuida de quebras de linha dentro de nomes de arquivos (o linux os permite, o windows não) separando os resultados com nulos, por exemplo:

print -rN -- **/*(/) |xargs -0 -n10 chmod g+s

que recursivamente define o bit setguid - seletivamente endereçando diretórios, ao contrário de chmod -R g+s .

Update3

Para árvores grandes, isso processa apenas uma parte dos arquivos (devido ao limite do tamanho da linha de comando) e, silenciosamente, deixa o restante como está. Os seguintes comandos podem lidar com esta situação:

find . -type d -print0 |xargs -0 -n10 chmod g+s
    
por 13.08.2015 / 12:27
-1

@enzotib está certo, e com isso em mente, o comando que lista os diretórios sob pwd em zsh é:

ls .(/)

    
por 01.09.2011 / 22:40

Tags