GNU/Linux >> Linux Esercitazione >  >> Linux

C'è qualcosa di più veloce di `find . | wc -l` per contare i file in una directory?

Non un'accelerazione fondamentale, ma almeno qualcosa :)

find . -printf \\n | wc -l

Non hai davvero bisogno di passare l'elenco dei nomi dei file, bastano solo le nuove righe. Questa variante è circa il 15% più veloce sul mio Ubuntu 12.04.3 quando le directory sono memorizzate nella cache nella RAM. Inoltre, questa variante funzionerà correttamente con nomi di file contenenti newline.

È interessante notare che questa variante sembra essere un po' più lenta di quella sopra:

find . -printf x | wc -c

Caso speciale, ma molto veloce

Se la directory si trova sul proprio file system, puoi semplicemente contare gli inode:

df -i .

Se il numero di directory e file in directory diverse da quella conteggiata non cambia molto, puoi semplicemente sottrarre questo numero noto dall'attuale df -i risultato. In questo modo sarai in grado di contare i file e le directory molto velocemente.


Ho scritto ffcnt proprio per questo scopo. Recupera l'offset fisico delle directory stesse con fiemap ioctl e quindi pianificare l'attraversamento della directory in più passaggi sequenziali per ridurre l'accesso casuale. Se ottieni effettivamente un'accelerazione rispetto a find | wc dipende da diversi fattori:

  • tipo di filesystem:filesystem come ext4 che supportano il fiemap ioctl ne beneficerà maggiormente
  • velocità di accesso casuale:gli HDD ne traggono molti più vantaggi rispetto agli SSD
  • layout delle directory:maggiore è il numero di directory nidificate, maggiore è il potenziale di ottimizzazione

(ri)montaggio con relatime o anche nodiratime può anche migliorare la velocità (per tutti i metodi) quando gli accessi causerebbero altrimenti l'aggiornamento dei metadati.


In realtà, sul mio sistema (Arch Linux) questo comando

   ls -A | wc -l

è più veloce di tutti i precedenti:

   $ time find . | wc -l
  1893

   real    0m0.027s
   user    0m0.004s
   sys     0m0.004s
   $ time find . -printf \\n  | wc -l
   1893

   real    0m0.009s
   user    0m0.000s
   sys     0m0.008s
   $ time find . -printf x  | wc -c
   1893

   real    0m0.009s
   user    0m0.000s
   sys     0m0.008s
   $ time ls -A | wc -l
   1892

   real    0m0.007s
   user    0m0.000s
   sys     0m0.004s

Linux
  1. Come contare il numero di file e sottodirectory all'interno di una determinata directory

  2. Perché una nuova directory ha un numero di collegamenti fisici pari a 2 prima che venga aggiunto qualcosa?

  3. Eliminazione di file per età?

  4. Qual è il modo migliore per contare il numero di file in una directory?

  5. Conta le righe di tutti i file nella directory di Ubuntu

Come contare i file nella directory in Linux

Trova ed elimina il file più vecchio se ci sono più di X file in una directory in Linux

Come contare il numero di file e sottodirectory all'interno di una directory

Come contare i file nella directory su Linux

Conta il numero di file in una directory in Linux

Come contare il numero di file in una directory in Linux