Como posso contar o número de pastas em uma unidade usando Linux?

24

Preciso organizar um disco rígido externo para que não haja mais de 500 pastas nele. O painel "Propriedades" do Ubuntu mostra apenas a contagem de arquivos, não a contagem de pastas.

Existe uma linha de comando simples que me diga o número de subdiretórios?

Eu preciso contar recursivamente, e a unidade é um disco rígido externo montado em /media/MUSIC/. É para um sistema de som automotivo cuja documentação diz que apenas lê as primeiras 500 pastas.

Dean Rather
fonte

Respostas:

20

Navegue até sua unidade e simplesmente execute

ls -lR | grep ^d | wc -l
Aniket Thakur
fonte
Parece fornecer um número mais correto do que a resposta que aceitei há 3 anos. Ele contava o diretório em que eu estava, enquanto isso não acontecia.
Dean Rather
Também vejo números diferentes, mas não muito diferentes.
SPRBRN
Pessoalmente, eu prefiro o grep -cover the wc -l. Talvez seja só eu.
Maxim_united
1
O acima será contado se alguma entrada do diretório contiver a sequência \nd(onde \nestá o caractere NL).
Toby Speight
1
Toby está certo, a lsprodução não deve ser canalizada . Além disso, este será muito mais lento, porque tem de saída de toda a árvore e, em seguida, executar grep através dele
phuclv
37

Localizar todas as pastas no total, incluindo subdiretórios?

find /mount/point -type d | wc -l

... ou encontrar todas as pastas no diretório raiz (sem incluir os subdiretórios)?

find /mount/point -maxdepth 1 -type d | wc -l
charlatão quixote
fonte
Esse primeiro é exatamente o que eu estou procurando. Obrigado!
Dean Em vez
@ Dean: Sim, eu já usei para contar diretórios na minha coleção de músicas antes também. :) pelos direitos de se gabar, conte seus MP3s: find / mount / point -type f | grep -i mp3 | wc -l
quack quixote
1
@ Dean: sim, eu não conheço a sintaxe de localização de imediato, mas eu usaria grep -v para isso: find / mount / pt -type f | grep -vi mp3 | grep -vi wav | wc -l ... (e <i> </ i> não funciona nos comentários, o uso *foo*em itálico: foo )
quack quixote
2
@Dean: eu acho que você tinha acabado de usar find /path -not -iname '*.mp3' | wc -la MP3s de filtro, ou para obter ambos os MP3s e uso WAVsfind /path -not -iname '*.mp3' -not -iname '*.wav' | wc -l
quack quixote
1
Necessário adicionar o -type f para que ele também ignore pastas, mas parabéns! Acabei de encontrar um monte de arquivos m4a que eu não tinha idéia ... Obrigado!
Dean Em vez
4

Novas linhas são caracteres válidos nos nomes de diretório. Sugiro deixar findimprimir uma linha vazia para cada diretório encontrado e depois wccontar essas linhas.

find /mount/point -type d -printf '\n' | wc -l
Erik Sjölund
fonte
3

Tente o seguinte [veja abaixo]:

ls -1 -p | grep "/" | wc -l

Isso imprimirá uma lista de uma coluna do diretório atual, com barras finais para itens subdiretórios, e depois contará as linhas com as barras.

EDIT: você provavelmente deve concordar com a resposta do quack quixote, pois é um pouco mais explícita, mas eu corrigi a minha (depois de considerar as sugestões do quack).

ls -Rp | grep "/$" | wc -l
dublê
fonte
Precisa adicionar -R para se tornar recursivo (desculpe por não mencionar) e precisa especificar o caminho para ls, mas sim, isso funciona: ls -1 -p -R / media / MUSIC / | grep "/" | wc -l Obrigado!
Dean Em vez
Depois de tentar essa sugestão e a de Quack Quixote, obtive 2 resultados diferentes ... Estou inclinado a acreditar no outro. Obrigado mesmo assim!
Dean Em vez
1
não é necessário, -1pois o ls detectará o canal e não formatará as colunas. você também pode pegar listagens recursivas com -R, mas provavelmente deseja grep para "/$"corresponder apenas as barras finais (ou a contagem será desativada). versão final:ls -Rp | grep "/$" | wc -l
quack quixote
1
a versão encontrada que publiquei contará .(ou seja /mount/point) em sua contagem, a versão ls no meu comentário acima não. essas contagens diferem por 1, embora você possa usar /mount/point/*o comando find para corrigir isso (assumindo que não haja diretórios de pontos ocultos).
quack quixote
Não sei por que você obteve os dois resultados diferentes, mas o método do @ quack incluirá diretórios "ocultos" (ou seja, aqueles que começam com '.').
Stuntmouse
1

Escrevi ffcnt para acelerar a contagem recursiva de arquivos sob circunstâncias específicas: discos rotacionais e sistemas de arquivos que oferecem suporte ao mapeamento de extensão.

Pode ser uma ordem de magnitude mais rápida do que lsou findabordagens baseadas

the8472
fonte
1

Quando há um grande número de diretórios, ferramentas como treepodem levar uma eternidade para terminar ou até travar, portanto, você pode usar algo mais eficiente.

A maneira mais eficiente de contar os diretórios em que posso pensar seria a seguinte, pois findimprimirá apenas um .para cada pasta encontrada, em vez do caminho completo e do nome do arquivo, e wcsó precisará percorrer o número de caracteres:

find /mount/point -type d -printf '.' |wc -c

Para excluir- /mount/pointse do cálculo e contar apenas os subdiretórios:

find /mount/point -mindepth 1 -type d -printf '.' |wc -c
David
fonte
1

Eu achei du --inodesútil, mas não tenho certeza de qual versão durequer. No Ubuntu 17.10, o seguinte funciona:

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

Combine com | sort -nrpara classificar decrescente pelo número de inodes contendo.

krlmlr
fonte
0

Eu gosto de usar a árvore para puxar a contagem de diretórios com

tree -d -R -fi --noreport | wc -l

Ou, use mal o find para mostrar que grande parte das pastas está localizada com

find . -type d -printf "%h\n" | cut -d/ -f-2 | sort | uniq -c | sort -rn
Cameron L.
fonte
Ou algo como: tree | grep -e '^. * diretórios,'
mindcrime
-2

Para encontrar o número de pastas e diretório no diretório atual

Digite o seguinte comando no seu terminal

echo */ | wc
ASHISH RANJAN
fonte