Posso determinar o número de subdiretórios em um diretório usando 'ls -l'?

8

Ao exibir diretórios usando ls -l , o número de links (o segundo campo na saída) é pelo menos dois: um para o nome da pasta e outro para .

$ mkdir foo
$ ls -l
total 2
drwxr-xr-x  2 user   wheel  512  4 oct 14:02 foo

É seguro assumir que o número de links acima de 2 corresponde ao número de subdiretórios nesse diretório ( .. links)?

    
por Eugene Yarmash 04.10.2010 / 21:42

5 respostas

7

É 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, há casos em que isso não é verdade:

  • Alguns unices permitem links rígidos para diretórios. Em seguida, haverá mais de dois links que não correspondem a subdiretórios.

  • Existem sistemas de arquivos nos quais os diretórios não possuem entradas para . e .. . O Manual de localização da GNU menciona alguns exemplos na discussão de sua opção -noleaf (que desativa uma otimização que assume que . e .. existem 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 (pode ainda 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 em bash e zsh onde você pode ativar a opção nullglob ).

    
por 04.10.2010 / 22:09
2

Aqui está outra forma de contar os subdiretórios (não recursivamente) no Bash:

(
shopt -s nullglob dotglob
printf '%s
(
shopt -s nullglob dotglob
printf '%s%pre%0' */ | tr -dc '%pre%' | wc -c  # wc counts null bytes
)
0' */ | tr -dc '%pre%' | wc -c # wc counts null bytes )

Como cada nome de arquivo está sendo finalizado por um caractere NUL ASCII, isso deve funcionar corretamente, mesmo que um nome de arquivo contenha um caractere de nova linha.

    
por 16.09.2011 / 14:51
2

Você poderia tentar com:

ls -l |grep ^d | wc -l
    
por 04.10.2010 / 21:57
1

Não consigo encontrar nada na documentação que confirme que o número de os links sempre serão +2 no número de subdiretórios.

Mas, para encontrar a quantidade correta, use:

find . -type d -mindepth 1  -maxdepth 1 | wc -l

Ou se você tiver que usar ls -l , veja a outra resposta.

    
por 04.10.2010 / 22:00
0

Não use ls para isso . Aqui está uma maneira que funciona com todos nomes de arquivos, mesmo aqueles que contêm novas linhas, porque imprime apenas um caractere de nova linha em vez do nome do arquivo:

find . -mindepth 1 -maxdepth 1 -type d -printf '\n' | wc -l

Editar: A versão atual não resulta em nenhum aviso, porque -mindepth e -maxdepth devem estar antes de -type (a árvore de diretórios é removida antes de verificar os diretórios, para economizar tempo).

    
por 16.09.2011 / 12:40