GNU/Linux >> Tutoriels Linux >  >> Linux

Existe-t-il quelque chose de plus rapide que `find . | wc -l` pour compter les fichiers dans un répertoire ?

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

Linux
  1. Comment compter le nombre de fichiers et de sous-répertoires dans un répertoire donné

  2. Pourquoi un nouveau répertoire a-t-il un nombre de liens physiques de 2 avant que quoi que ce soit ne soit ajouté ?

  3. Suppression de fichiers par âge ?

  4. Quelle est la meilleure façon de compter le nombre de fichiers dans un répertoire ?

  5. Renommer les fichiers dans le répertoire ?

Comment compter les fichiers dans le répertoire sous Linux

Rechercher et supprimer le fichier le plus ancien s'il y a plus de X fichiers dans un répertoire sous Linux

Comment compter le nombre de fichiers et de sous-répertoires dans un répertoire

Comment compter les fichiers dans le répertoire sous Linux

Compter le nombre de fichiers dans un répertoire sous Linux

Comment compter le nombre de fichiers dans un répertoire sous Linux