Pas une accélération fondamentale mais au moins quelque chose :)
find . -printf \\n | wc -l
Vous n'avez vraiment pas besoin de passer la liste des noms de fichiers, seules les nouvelles lignes suffisent. Cette variante est environ 15 % plus rapide sur mon Ubuntu 12.04.3 lorsque les répertoires sont mis en cache dans la RAM. De plus, cette variante fonctionnera correctement avec les noms de fichiers contenant des retours à la ligne.
Fait intéressant, cette variante semble être un peu plus lente que celle ci-dessus :
find . -printf x | wc -c
Cas particulier - mais très rapide
Si le répertoire est sur son propre système de fichiers, vous pouvez simplement compter les inodes :
df -i .
Si le nombre de répertoires et de fichiers dans d'autres répertoires que celui compté ne change pas beaucoup, vous pouvez simplement soustraire ce nombre connu du df -i
actuel résultat. De cette façon, vous pourrez compter les fichiers et répertoires très rapidement.
J'ai écrit ffcnt exactement dans ce but. Il récupère le décalage physique des répertoires eux-mêmes avec le fiemap
ioctl, puis en planifiant la traversée du répertoire en plusieurs passages séquentiels pour réduire l'accès aléatoire. Si vous obtenez réellement une accélération par rapport à find | wc
dépend de plusieurs facteurs :
- type de système de fichiers :systèmes de fichiers tels que ext4 qui prennent en charge le
fiemap
ioctl en bénéficiera le plus - vitesse d'accès aléatoire :les disques durs bénéficient bien plus que les disques SSD
- Disposition des répertoires :plus le nombre de répertoires imbriqués est élevé, plus le potentiel d'optimisation est important
(re)montage avec relatime
ou même nodiratime
peut également améliorer la vitesse (pour toutes les méthodes) lorsque les accès entraîneraient autrement des mises à jour des métadonnées.
En fait, sur mon système (Arch Linux) cette commande
ls -A | wc -l
est plus rapide que tout ce qui précède :
$ 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