É geralmente verdadeiro em sistemas UNIX que o número de links para um diretório é o número de subdiretórios mais 2. No entanto, existem casos em que isso não é verdade:
Alguns departamentos permitem links físicos para diretórios. Depois, haverá mais de 2 links que não correspondem aos subdiretórios.
Existem sistemas de arquivos nos quais os diretórios não possuem entradas para .
e ..
. O manual de localização do GNU menciona alguns exemplos na discussão de sua -noleaf
opção (que desativa uma otimização que supõe isso .
e ..
existe em todos os diretórios): “sistemas de arquivos em CD-ROM ou MS-DOS ou pontos de montagem de volume do AFS”
Uma maneira quase confiável de contar o número de subdiretórios (ainda pode falhar se um nome de arquivo contiver um caractere de nova linha) é
$(($(LC_ALL=C ls -la /path/to/directory | grep '^d' | wc -l) - 2)
Uma maneira mais confiável usa globs de shell */
e .*/
; como de costume, lidar com o caso em que o padrão não corresponde é um pouco trabalhoso (exceto no bash e no zsh, onde você pode ativar a nullglob
opção).
Gilles 'SO- parar de ser mau'
fonte
-type d
, mas: 1. isso requer o GNU find; 2. Você precisa subtrair 1 para o diretório inicial (ou passar-mindepth 1
).Não use
ls
para isso . Aqui está uma maneira que funciona com todos os nomes de arquivos, mesmo aqueles que contêm novas linhas, porque imprime apenas um caractere de nova linha em vez do nome do arquivo:Editar: a versão atual não resulta em nenhum aviso, porque
-mindepth
e-maxdepth
deve ser anterior-type
(a árvore de diretórios é removida antes de procurar por diretórios, para economizar tempo).fonte