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