Pergunta

Estou procurando uma maneira rápida de encontrar o número de arquivos em um diretório no Linux.

Qualquer solução que leve tempo linear no número de arquivos no diretório NÃO é aceitável (por exemplo,"ls | wc -l" e coisas semelhantes) porque levaria um tempo proibitivamente longo (há dezenas ou talvez centenas de milhões de arquivos no diretório).

Tenho certeza de que o número de arquivos no diretório deve ser armazenado como um número simples em algum lugar da estrutura do sistema de arquivos (talvez inode?), como parte da estrutura de dados usada para armazenar as entradas do diretório - como posso chegar a esse número?

Editar:O sistema de arquivos é ext3.Se não houver uma maneira portátil de fazer isso, estou disposto a fazer algo específico para o ext3.

Foi útil?

Solução

Por que a estrutura de dados deveria conter o número?Uma árvore não precisa saber seu tamanho em O(1), a menos que seja um requisito (e desde que isso possa exigir mais bloqueio e possivelmente um gargalo de desempenho)

Por árvore, não quero dizer incluir o conteúdo do subdiretório, mas os arquivos com -maxprofundidade 1 - supondo que eles não estejam realmente armazenados como uma lista.

editar:ext2 os armazenou como uma lista vinculada.

implementos ext3 modernos árvores B com hash

Dito isto, /bin/ls faz muito mais do que contar e realmente verifica todos os inodes.Escreva seu próprio programa ou script C usando opendir() e readdir().

de aqui:

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
int main()
{
        int count;
        struct DIR *d;
        if( (d = opendir(".")) != NULL)
        {
                for(count = 0;  readdir(d) != NULL; count++);
                closedir(d);
        }
        printf("\n %d", count);
        return 0;
}

Outras dicas

Você pode usar inotify para rastrear e gravar os eventos de criação de arquivos e desvincular no diretório monitorado.Ele distribuiria o tempo total necessário para manter a contagem de arquivos e permitir que você recupere a contagem de arquivos atual instantaneamente.

O inode para o diretório não armazena o número de arquivos, pois geralmente a contagem de arquivos não é necessária separadamente da lista de nomes no diretório.O diretório A contagem de links do INODE fornece indiretamente o número de sub-diretórios (st_nlink é o número de sub-diretros mais dois).

Eu acho que você não tem escolha, exceto ler através de toda a lista de arquivos no diretório.encontrar pode ou pode não ser mais rápido que ls.

Este é um exemplo de por que grandes diretórios são um problema, mesmo quando o diretório é implementado usando uma árvore B.

Não há maneira portátil de fazer isso.Os primitivos de arquivos de baixo nível, ou seja, Readdir , trabalhe Como se é uma lista linear.Claramente, isso é uma abstração, e alguns sistemas de arquivos podem armazenar uma contagem.No entanto, acessá-lo é inerentemente específico do sistema de arquivos.

Se você estiver disposto a pular através de aros, você pode ter cada diretório em um sistema de arquivos diferente, usar cotas e obter as informações com o comando "repqutata".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top