GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Gibt es etwas schnelleres als `find . | wc -l` um Dateien in einem Verzeichnis zu zählen?

Keine grundlegende Beschleunigung, aber immerhin etwas :)

find . -printf \\n | wc -l

Sie müssen die Liste der Dateinamen wirklich nicht übergeben, es genügen nur die Zeilenumbrüche. Diese Variante ist auf meinem Ubuntu 12.04.3 etwa 15 % schneller, wenn die Verzeichnisse im RAM zwischengespeichert werden. Außerdem funktioniert diese Variante korrekt mit Dateinamen, die Zeilenumbrüche enthalten.

Interessanterweise scheint diese Variante etwas langsamer zu sein als die obige:

find . -printf x | wc -c

Sonderfall - aber richtig schnell

Wenn sich das Verzeichnis auf einem eigenen Dateisystem befindet, können Sie die Inodes einfach zählen:

df -i .

Wenn sich die Anzahl der Verzeichnisse und Dateien in anderen Verzeichnissen als dem gezählten nicht wesentlich ändert, können Sie diese bekannte Anzahl einfach von der aktuellen df -i subtrahieren Ergebnis. Auf diese Weise können Sie die Dateien und Verzeichnisse sehr schnell zählen.


Genau für diesen Zweck habe ich ffcnt geschrieben. Es ruft den physikalischen Offset der Verzeichnisse selbst mit dem fiemap ab ioctl und dann das Planen des Verzeichnisdurchlaufs in mehreren aufeinanderfolgenden Durchgängen, um den zufälligen Zugriff zu reduzieren. Ob Sie tatsächlich eine Beschleunigung im Vergleich zu find | wc erhalten hängt von mehreren Faktoren ab:

  • Dateisystemtyp:Dateisysteme wie ext4, die den fiemap unterstützen ioctl wird am meisten profitieren
  • Zufallszugriffsgeschwindigkeit:HDDs profitieren weit mehr als SSDs
  • Verzeichnislayout:Je höher die Anzahl der verschachtelten Verzeichnisse, desto mehr Optimierungspotenzial

(Wieder-)Montage mit relatime oder sogar nodiratime kann auch die Geschwindigkeit verbessern (für alle Methoden), wenn die Zugriffe andernfalls Metadatenaktualisierungen verursachen würden.


Eigentlich ist auf meinem System (Arch Linux) dieser Befehl

   ls -A | wc -l

ist schneller als alle oben genannten:

   $ 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. Warum hat ein neues Verzeichnis eine Anzahl fester Links von 2, bevor etwas hinzugefügt wird?

  2. Dateien nach Alter löschen?

  3. Was ist der beste Weg, um die Anzahl der Dateien in einem Verzeichnis zu zählen?

  4. Wie zähle ich die Anzahl der Dateien in einem Verzeichnis und lösche die ältesten, wenn die Anzahl 5 überschreitet?

  5. Entpacken Sie alle Dateien in einem Verzeichnis

So zählen Sie Dateien im Verzeichnis in Linux

Älteste Datei finden und löschen, wenn mehr als X Dateien in einem Verzeichnis in Linux vorhanden sind

So zählen Sie die Anzahl der Dateien und Unterverzeichnisse in einem Verzeichnis

So zählen Sie Dateien im Verzeichnis unter Linux

Zählen Sie die Anzahl der Dateien in einem Verzeichnis in Linux

So zählen Sie die Anzahl der Dateien in einem Verzeichnis in Linux