maneira rápida de contar recursivamente arquivos no linux

3

Estou usando o seguinte para contar o número de arquivos em um diretório e seus subdiretórios:

find . -type f | wc -l

Mas eu tenho meio milhão de arquivos e a contagem leva muito tempo.

Existe uma maneira mais rápida de obter uma contagem do número de arquivos, o que não envolve canalizar uma quantidade enorme de texto para algo que conta as linhas? Parece ser uma maneira ineficiente de fazer as coisas.

    
por aidan 23.11.2010 / 10:57

7 respostas

8

Se você tiver isso em um sistema de arquivos dedicado, ou se tiver um número fixo de arquivos sobrecarregados, poderá obter uma contagem aproximada do número de arquivos observando o número de inodes no arquivo. sistema via "df -i":

root@dhcp18:~# df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1            60489728   75885 60413843    1% /

Na minha caixa de teste acima eu tenho 75,885 inodes alocados. No entanto, esses inodes não são apenas arquivos, eles também são diretórios. Por exemplo:

root@dhcp18:~# mkdir /tmp/foo
root@dhcp18:~# df -i /tmp 
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1            60489728   75886 60413842    1% /
root@dhcp18:~# touch /tmp/bar
root@dhcp18:~# df -i /tmp
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1            60489728   75887 60413841    1% /

NOTA: Nem todos os sistemas de arquivos mantêm contagens de inode da mesma maneira. ext2 / 3/4 irá funcionar, no entanto o btrfs sempre reporta 0.

Se você tem que diferenciar arquivos de diretórios, você terá que percorrer o sistema de arquivos e "stat" para ver se é um arquivo, diretório, sym-link, etc ... O maior problema aqui não é o encanamento de todo o texto para "wc", mas sim procurar entre todos os inodes e entradas de diretório para juntar esses dados.

Diferentemente da tabela de inodes, como mostrado por "df -i", não há realmente nenhum banco de dados de quantos arquivos existem em um determinado diretório. No entanto, se essa informação for importante para você, você poderá criar e manter um banco de dados fazendo com que seus programas incrementem um número quando criarem um arquivo nesse diretório e o decrescerem quando excluídos. Se você não controla os programas que os criam, isso não é uma opção.

    
por 23.11.2010 / 14:34
1

Eu também tentaria:

find topDir -maxdepth 3 -printf '%h %f\n'

E, em seguida, processe a saída, reduzindo em contagem para os diretórios.

Isso é especialmente útil se você antecipar a estrutura de diretórios.

    
por 25.04.2012 / 18:43
1

se você tiver instalado, poderá usar

locate -r '.' | grep -c "^$PWD"

ou para obter um resultado em todo o sistema de arquivos

locate -S

Será muito mais rápido do que descobrir se você tem muitos arquivos.

o único inconveniente é que também conta os diretórios

    
por 12.05.2015 / 12:05
1

Eu escrevi um programa de contagem de arquivos personalizado para essa pergunta do StackOverflow: link

Você pode encontrar o repositório do GitHub aqui se quiser navegar, fazer download ou contribuir com: link

    
por 25.10.2017 / 21:38
1

Se você quiser contar recursivamente o número de arquivos em um diretório, o comando locate é o fastet que eu conheço, supondo que você tenha um banco de dados atualizado (sudo update database .. made por padrão via cronômetro todos os dias). No entanto, você pode acelerar o comando se evitar o canal grep .

Veja man locate :

-c, --count
       Instead  of  writing  file  names on standard output, write the number of 
       matching entries only.

Então o comando mais rápido é:

locate -c -r '/path/to/dir'
    
por 24.04.2018 / 12:38
1

Paralelize. Execute um comando find separado para cada subdiretório e execute-os ao mesmo tempo. Pode automatizar isso usando xargs .

    
por 24.04.2018 / 18:49
0

Experimente este prático script Python para ver se é mais rápido.

from os import walk
print sum([len(files) for (root, dirs, files) in walk('/some/path')])

Andrew

    
por 23.11.2010 / 14:10