Pregunta

Estoy buscando una forma rápida de encontrar la cantidad de archivos en un directorio en Linux.

Cualquier solución que requiera un tiempo lineal en la cantidad de archivos en el directorio NO es aceptable (p. ej."ls | wc -l" y cosas similares) porque tomaría una cantidad de tiempo prohibitivamente larga (hay decenas o tal vez cientos de millones de archivos en el directorio).

Estoy seguro de que la cantidad de archivos en el directorio debe almacenarse como un número simple en algún lugar de la estructura del sistema de archivos (¿inodo quizás?), como parte de la estructura de datos utilizada para almacenar las entradas del directorio. ¿Cómo puedo llegar a este número?

Editar:El sistema de archivos es ext3.Si no existe una forma portátil de hacer esto, estoy dispuesto a hacer algo específico para ext3.

¿Fue útil?

Solución

¿Por qué la estructura de datos contiene el número?Un árbol no necesita saber su tamaño en O (1), a menos que sea un requisito (y proporcionarlo, podría requerir más bloqueo y posiblemente un cuello de botella de rendimiento)

por árbol No quiero que incluya los contenidos de Subdir, pero los archivos con -MAXDEPTH 1 - Suponiendo que no se almacenan realmente como una lista.

Editar: ext2 los almacenó como una lista vinculada.

Modern ext3 implementa b-árboles hashed

Dicho esto, / bin / ls hace mucho más que contar, y en realidad escanea todas las inoduras.Escriba su propio programa o Script de C con OpenDir () y ReadDir ().

de aquí :

#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;
}

Otros consejos

Puede usar inotify para rastrear y grabar el archivo Crear y desvincular eventos en el directorio monitoreado.Distribuiría el tiempo total requerido para mantener el recuento de archivos y permitirle recuperar el recuento de archivos actual instantáneamente.

El inodo del directorio no almacena la cantidad de archivos que contiene, ya que normalmente el recuento de archivos no se necesita por separado de la lista de nombres en el directorio.El recuento de enlaces del inodo del directorio proporciona indirectamente el número de subdirectorios (st_nlink es el número de subdirectorios más dos).

Creo que no tiene otra opción que leer la lista completa de archivos en el directorio.find podría o no ser más rápido que ls.

Este es un ejemplo de por qué los directorios grandes son un problema, incluso cuando el directorio se implementa mediante un árbol B.

No hay una forma portátil de hacer esto.Los primitivos de archivo de bajo nivel, es decir, readdir , trabajo como si es una lista lineal.Claramente, eso es una abstracción, y algunos sistemas de archivos pueden almacenar un conteo.Sin embargo, acceder a ella es inesherentemente específico del sistema de archivos.

Si está dispuesto a saltar a través de los aros, puede tener cada directorio en un sistema de archivos diferente, use cuotas y obtenga la información con el comando "REPCQUOTA".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top