
Mir ist aufgefallen, dass ls -l
die physische Größe eines Verzeichnisses gemeldet wird, während die logische Größe einer Datei gemeldet wird. Dies ist beispielsweise eine Beispielausgabe von ls -l
:
drwxr-xr-x 2 chris chris 36864 2017-04-23 18:14 dir1
-rw-r--r-- 1 chris chris 6 2017-04-23 18:10 file1.txt
dir1
Die Größe beträgt 36864 Bytes, was ein Vielfaches von 4096 Bytes ist (es handelt sich also wahrscheinlich um die physische Größe).
Die file1.txt
Größe beträgt 6 Bytes (das ist die logische Größe).
Antwort1
Tatsächlich ls
wird alles gemeldet, was der Kernel ihm sagt: Die Größe wird nicht anders angegeben, je nachdem, ob die Datei ein Verzeichnis ist oder nicht. Und Linux meldet die logische Größe. Die logische Größe eines Verzeichnisses ist jedoch keine sehr interessante Eigenschaft: Sie hängt vom Dateisystemformat ab.
Der Standarddateisystemtyp der meisten Linux-Distributionen ist ext4, und das ist wahrscheinlich das, was Sie verwenden. Ext4 weist Verzeichnissen ganze Blöcke zu und verwaltet den Speicherplatz innerhalb dieser Blöcke nach eigenem Ermessen. Es gibt nicht einmal Blöcke frei, wenn ein Verzeichnis kleiner wird (es dir1
würden weiterhin 9 Blöcke vorhanden sein, selbst wenn Sie alle darin enthaltenen Dateien entfernen würden). Wenn nach der Größe einer Datei gefragt wird, die zufällig ein Verzeichnis ist, gibt ext4 die Größe zurück, die dem Verzeichnis zugewiesen ist, und dies ist immer eine ganze Zahl von Blöcken.
Verschiedene Dateisystemtypen verhalten sich unterschiedlich. Bei Btrfs beispielsweise kann die Größe eines Verzeichnisses experimentell ein beliebiges Vielfaches von 2 sein.
Antwort2
Das ist eine Funktion der ext2
/ ext3
/ ext4
-Dateisysteme, sie melden die Größe von Verzeichnissen in ganzen Blöcken. Wenn Sie dasselbe mit XFS versuchen, sehen Sie eine feinkörnigere Größe.
Eigentlich spielt es keine Rolle. Bei Dateien ist die „logische“ Größe relevant, da eine Anwendung davon abhängen kann, die Größe einer Datei bis auf ein Byte genau zu kennen: nachfolgender Müll kann relevant sein, oder eine Datenstruktur kann an einer Position relativ zum Ende der Datei platziert werden (z. B. .zip-Archive).
Bei Verzeichnissen spielt die „logische“ Größe keine Rolle, da die interne Struktur bekannt ist und ein Userspace-Programm unter Linux den Inhalt eines Verzeichnisses nicht einmal direkt lesen kann. Stattdessen muss ein Lesevorgang über Systemaufrufe erfolgen, die genau zu diesem Zweck ausgeführt werden. Und diese Systemaufrufe befassen sich mit der internen Struktur des Verzeichnisses.