Das ist ein völlig nutzloser, in der praktischen Anwendung unnötiger, aber amüsanter kleiner Beitrag über Verzeichnisse in *nix-Systemen. Es ist schließlich Freitag.
In Vorstellungsgesprächen tauchen oft langweilige Fragen zu Inodes und alles-ist-eine-Datei auf, auf die nur wenige sinnvoll antworten können. Wenn man jedoch etwas tiefer gräbt, findet man interessante Dinge.
Um den Beitrag zu verstehen, einige Thesen:
- Alles ist eine Datei. Ein Verzeichnis ist auch eine Datei.
- Inodes speichern Metadaten zur Datei, aber der Name der Datei wird dort nicht gespeichert.
- Der Dateiname wird in den Verzeichnisdaten gespeichert.
- Die Größe des Verzeichnisses, die in ls angezeigt wird und standardmäßig 4 KB beträgt, hängt von der Anzahl der Dateien im Verzeichnis und der Länge ihrer Namen ab.
- Offensichtlich gilt: Je mehr Dateien, desto größer ist das Verzeichnis.
Und jetzt etwas Interessantes: Erstellen wir ein Verzeichnis mit einer Million Dateien, überprüfen die Größe des Verzeichnisses und löschen dann alle Dateien, um die Größe des Verzeichnisses zu betrachten.
$ mkdir niceDir && cd niceDir
# Je nach Geschwindigkeit des Mediums kann der folgende Befehl 2-10 Minuten dauern
$ for ((i=1;i<133700;i++)); do touch long_long_looong_man_sakeru_$i ; done
$ ls -lhd .
drwxr-xr-x 2 user user 8.1M Aug 2 13:37 .
$ find . -type f -delete
$ ls -l
total 0
$ ls -lhd .
drwxr-xr-x 2 user user 8.1M Aug 2 13:37 .Wie man sehen kann, hat sich die Größe des Verzeichnisses nicht geändert, obwohl es so schien 🙂.
Die Größe des Verzeichnisses (ohne Löschen) kann nur mit fsck (und der Option -D) im unmontierten Zustand repariert werden.
Als ich dann nachsuchte, warum das so ist, stellte sich heraus, dass dieses Verhalten bereits vor 10 Jahren in der lkml diskutiert wurde. Und laut den Entwicklern lohnt sich die Korrektur einfach nicht. Das ist ein völlig nutzloser, in der praktischen Anwendung unnötiger, aber amüsanter kleiner Beitrag über Verzeichnisse in *nix-Systemen.
Quelle: habr.com
