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