Como contar o número total de arquivos / pastas em um sistema?

7

Como posso contar o número de todos os arquivos / pastas que existem em um sistema, usando a linha de comando?

Eu posso encontrá-lo usando uma GUI, simplesmente abrindo a janela de propriedades para a pasta / inteira, mas seria bom saber como fazer isso usando a linha de comando.

Eu precisaria de toda uma série de comandos ou apenas um seria possível?

    
por DevRobot 19.12.2015 / 18:32

6 respostas

11

Como os nomes de arquivos / pastas podem conter novas linhas:

sudo find / -type f -printf '.' | wc -c
sudo find / -type d -printf '.' | wc -c

Isso contará qualquer arquivo / pasta no diretório / atual. Mas, como aponta Muru, você pode querer excluir sistemas de arquivos virtuais / outros da contagem (o seguinte excluirá qualquer outro sistema de arquivos montado):

find / -xdev -type f -printf '.' | wc -c
find / -xdev -type d -printf '.' | wc -c
  • sudo find / -type f -printf '.' : imprime um ponto para cada arquivo em / ;
  • sudo find / -type d -printf '.' : imprime um ponto para cada pasta em / ;
  • wc -c : conta o número de caracteres.

Veja um exemplo de como não cuidar de novas linhas em nomes de arquivos / pastas pode violar outros métodos, como, por exemplo, find / -type f | wc -l e como usar find / -type f -printf '.' | wc -c corrige:

% ls
% touch "file
\'dquote> with newline"
% find . -type f | wc -l
2
% find . -type f -printf '.' | wc -c
1

Se o STDOUT não for um terminal, find imprimirá literalmente cada nome de arquivo / pasta; Isso significa que um nome de arquivo / pasta contendo uma nova linha será impresso em duas linhas diferentes, e que wc -l contará duas linhas para um único arquivo / pasta, imprimindo um resultado em um.

    
por kos 19.12.2015 / 18:37
7

1 método seria

sudo find / -type f | wc -l
sudo find / -type d | wc -l

(sudo para evitar erros de acesso)

f para arquivos, d para diretórios.

O / proc / filesystem irá cometer erros, mas eu não considero esses arquivos;)

    
por Rinzwind 19.12.2015 / 18:34
5

Se você realmente quiser o número total de objetos em seus sistemas de arquivos, use df -i para contar inodes. Você não obterá a divisão entre diretórios e arquivos simples, mas no lado positivo ele é executado quase instantaneamente. O número total de inodes usados é algo que os sistemas de arquivos já rastreiam.

Se você quiser usar uma das sugestões com base em find , não a execute apenas em / . Use find -xdev em uma lista de pontos de montagem gerados por algo como findmnt --list -v -U -t xfs,ext3,ext4,btrfs,vfat,ntfs -o TARGET ou algo assim. Isso não exclui montagens de associação, portanto, os arquivos sob montagens de ligação serão contados duas vezes. findmnt é bem legal.

Além disso, certamente há uma maneira simples de listar todas as suas montagens de "discos" sem ter que listar tipos explícitos de sistemas de arquivos, mas não sei exatamente o quê.

Como sugerido por outra resposta, use find -printf . | wc -c para evitar possíveis problemas ao contar caracteres engraçados em nomes de arquivos. Use -not -type d para contar arquivos não-diretório. (Você não quer excluir seus links simbólicos, não é?)

    
por Peter Cordes 20.12.2015 / 08:51
4
sudo find / -type f | wc -l

informará o número de arquivos regulares no seu sistema e

sudo find / -type d | wc -l

o número de pastas.

    
por Florian Diesch 19.12.2015 / 18:36
2

Usando zsh :

Como root , para arquivos regulares:

files=( /**/*(.D) )

isso levará todos os arquivos regulares, incluindo os que começam com . na matriz files , agora podemos simplesmente contar o número de elementos da matriz:

echo $#files

isso tratará de todos os casos de borda, por exemplo nomes de arquivos incomuns.

Similarmente para diretórios:

dirs=( /**/*(/D) )
echo $#dirs
    
por heemayl 20.12.2015 / 03:29
2

Outra abordagem que aproveita locatedb :

locate / | wc -l

Vantagens:

  • Não requer sudo
  • Muito mais rápido do que as abordagens baseadas em find (já pré-indexadas)
  • Já se aplica -xdev : ou seja, ignora arquivos especiais: /dev , /proc etc.

Desvantagens:

  • Não é 100% preciso: inclui diretórios, ignora arquivos em /tmp , pode duplicar ou contar mais arquivos com novas linhas em seus nomes, por exemplo
  • Mais lento que a abordagem df -i
  • Reflete "última realidade de instantâneo de 24 horas" em vez de estado atual exato
por arielf 26.12.2015 / 11:21