Domanda

Sto cercando un modo veloce per trovare il numero di file in una directory su Linux.

Qualsiasi soluzione che richiede il tempo lineare nel numero di file nella directory non è accettabile (ad es. "LS | wc -l" e cose simili) perché ci vorrebbe una quantità di tempo proibitiva (ci sono decine o forse centinaiadi milioni di file nella directory).

Sono sicuro che il numero di file nella directory deve essere memorizzato come un numero semplice da qualche parte nella struttura del filesystem (forse inode?), Come parte della struttura dei dati utilizzata per archiviare le voci della directory - come posso arrivare aQuesto numero?

Modifica: il filesystem è ext3.Se non c'è modo portatile di farlo, sono disposto a fare qualcosa di specifico per EXT3.

È stato utile?

Soluzione

Perché la struttura dei dati dovrebbe contenere il numero?Un albero non ha bisogno di conoscere le sue dimensioni in O (1), a meno che non sia un requisito (e fornendo ciò, potrebbe richiedere più bloccaggio e possibilmente un collo di bottiglia di performance)

per albero non intendo compreso contenuto di subdir, ma i file con -maxdepth 1 - supponendo che non siano realmente memorizzati come una lista ..

Modifica: EXT2 li ha memorizzati come elenco collegato.

Modern ext3 implements Hashed B-alberi

.

Avendo detto che, / bin / ls fa molto più che contare, e in realtà scansiona tutti gli inode.Scrivi il tuo programma c o script usando opendir () e readdir ().

da qui :

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

Altri suggerimenti

È possibile utilizzare Inotify per tracciare e registrare file creare e scollegare gli eventi nella directory monitorata.Distribuirebbe il tempo totale necessario per mantenere il conteggio dei file e consentire di recuperare il conteggio del file corrente istantaneamente.

L'Inode per la directory non memorizza il numero di file in esso, poiché in genere il conteggio dei file non è necessario separatamente dall'elenco dei nomi nella directory.Il conteggio del collegamento della directory inode dà indirettamente il numero di sottodirectory (st_nlink è il numero di sub-dirs più due).

Penso che non abbiate scelta tranne che leggi l'intero elenco di file nella directory.trovare potrebbe essere o potrebbe non essere più veloce di ls.

Questo è un esempio del perché le ampie directory sono un problema, anche quando la directory è implementata utilizzando un B-Tree.

Non c'è modo portatile per farlo.I primitivi dei file di basso livello, ad esempio readdir , lavoro Come se è un'elenco lineare.Chiaramente, questa è un'astrazione, e alcuni filesystem potrebbero memorizzare un conteggio.Tuttavia, l'accesso è intrinsecamente specifico del filesystem.

Se sei disposto a saltare attraverso i cerchi, potresti avere ogni directory in un filesystem diverso, utilizzare le quote e ottenere le informazioni con il comando "repertita".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top