Nicht selten muss ich die Anzahl der Dateien in einem Verzeichnis zählen, manchmal sind es Millionen.
Gibt es einen besseren Weg, als sie nur aufzuzählen und zu zählen find . | wc -l
? Gibt es eine Art Dateisystemaufruf, den Sie unter ext3 / 4 ausführen können und der weniger E / A-intensiv ist?
linux
filesystems
find
ext4
MattPark
quelle
quelle
find -maxdepth 1
. Beachten Sie, dass Sie mit Ihrem aktuellen Ansatz jeden Namen, der ein Zeilenumbruchzeichen enthält, doppelt zählen.Antworten:
Keine grundlegende Beschleunigung, aber zumindest etwas :)
Sie müssen die Liste der Dateinamen wirklich nicht übergeben, nur die Zeilenumbrüche reichen aus. 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:
Sonderfall - aber sehr schnell
Wenn sich das Verzeichnis in einem eigenen Dateisystem befindet, können Sie einfach die Inodes zählen:
Wenn sich die Anzahl der Verzeichnisse und Dateien in anderen als den gezählten Verzeichnissen nicht wesentlich ändert, können Sie diese bekannte Anzahl einfach vom aktuellen
df -i
Ergebnis abziehen . Auf diese Weise können Sie die Dateien und Verzeichnisse sehr schnell zählen.quelle
time find /usr/src/ -printf \\n | wc -l
können Sie die Caches zwischen den Läufen mitsudo sync && sudo sysctl -w vm.drop_caches=3
-printf x
das gleiche sein wie-printf '\0'
? Ich sehe es nicht in den Dokumenten erwähnt.-printf
funktioniert ähnlich wie dieprintf()
Funktion in C, mit dem Hauptunterschied, dass die%
Anweisungen eine andere Bedeutung haben. Die Aktion wird für jede gefundene Datei aufgerufen. Dies bedeutet, dass-printf x
das Zeichenx
für jede gefundene Datei gedruckt wird (probieren Sie es aus!) Und-printf '\0'
das Zeichen NULL (ASCII-Code 0) für jede gefundene Datei gedruckt wird.-printf '\0'
hat keine besondere Bedeutung. Beide funktionieren im Beispiel mitwc -c
in dieser Antwort gleich.Ich habe ffcnt genau zu diesem Zweck geschrieben. Es ruft den physischen Versatz der Verzeichnisse selbst mit dem
fiemap
ioctl ab und plant dann die Verzeichnisüberquerung in mehreren aufeinander folgenden Durchläufen, um den Direktzugriff zu reduzieren. Ob Sie im Vergleich zu tatsächlich eine Beschleunigung erzielen,find | wc
hängt von mehreren Faktoren ab:fiemap
ioctl unterstützen, profitieren am meistenDas (erneute) Mounten mit
relatime
odernodiratime
kann sogar die Geschwindigkeit (für alle Methoden) verbessern, wenn die Zugriffe andernfalls zu Metadatenaktualisierungen führen würden.quelle
Eigentlich auf meinem System (Arch Linux) dieser Befehl
ist schneller als alle oben genannten:
quelle
/bin/ls: Argument list too long
wenn Sie Globbing verwenden, aber andererseits kann es auch rekursiv wie find funktionieren. Vielleicht ist das etwas zu beachten, verwenden Sie find nicht, wenn es nicht benötigt wird.ls -A
nur die Dateien im aktuellen Verzeichnis aufzulisten, währendfind
ohne-maxdepth 1
Argument eine rekursive Suche in allen Unterverzeichnissen durchgeführt wird.