Freitag, 2. April 2021

Linux ls Kommando - Was bedeutet total ?

Wenn ein Verzeichnis mit dem Kommando ls -l aufgelistet wird, gibt es ja immer einen Vorspann der Art

noname@pb:~/todel/linktest$ ls -l a/b/c/d/e
total 24
drwxr-xr-x 2 noname noname       4096 Apr  2 13:29 f
drwxr-xr-x 2 noname noname       4096 Apr  2 13:25 f2
drwxr-xr-x 2 noname noname       4096 Apr  2 13:26 f3
drwxr-xr-x 2 noname noname       4096 Apr  2 13:28 f4
drwxr-xr-x 4 noname noname       4096 Apr  2 13:31 f5
-rw-r--r-- 1 noname noname 4194305024 Apr  2 13:52 fa
-rw-r--r-- 1 noname noname          0 Apr  2 13:28 fa2

Was bedeuet die Zahl 24?

Wie man bei GNU coreutils nachlesen kann, ist das die Summe aller direkten Einträge im aktuellen Ordner, dargestellt in der Standard Blockgröße 1024 Bytes ; Standard Blockgröße für die Kommandoausgabe (!=Dateisystemblockgröße).

Es wird hierbei der reale Platzverbrauch der Daten- und Verzeichnisdateien im Ordner berücksichtigt.

Verzeichnisdateien haben unabhängig von ihrem eigenen Inhalt nach ihrer Erzeugung eine konstante und fixe Größe von hier 4096 Bytes.

Die Datendateien können aber sogenannte Sparse Dateien sein, welche nominal größer sein können als ihr realer Plattenverbrauch im Dateisystem.

Man kann eine solche Sparse Datei z.B. mit dd erzeugen, was hier gemacht wurde:

noname@pb:~/todel/linktest$ dd if=/dev/zero of=a/b/c/d/e/fa bs=1k seek=4000k count=1
1+0 Datensätze ein
1+0 Datensätze aus
1024 bytes (1,0 kB, 1,0 KiB) copied, 0,000499488 s, 2,1 MB/s

Die reale Größe läßt sich hiermit anzeigen:

noname@pb:~/todel/linktest$ du -B 1 a/b/c/d/e/fa
4096    a/b/c/d/e/fa

Jetzt schauen wir uns nochmal die Auflistung des Ordners in Bytes an:

noname@pb:~/todel/linktest$ ls -l --block-size="1" a/b/c/d/e
total 24576
drwxr-xr-x 2 noname noname       4096 Apr  2 13:29 f
drwxr-xr-x 2 noname noname       4096 Apr  2 13:25 f2
drwxr-xr-x 2 noname noname       4096 Apr  2 13:26 f3
drwxr-xr-x 2 noname noname       4096 Apr  2 13:28 f4
drwxr-xr-x 4 noname noname       4096 Apr  2 13:31 f5
-rw-r--r-- 1 noname noname 4194305024 Apr  2 13:52 fa
-rw-r--r-- 1 noname noname          0 Apr  2 13:28 fa2

Der Ordner  a/b/c/d/e hat also in Summe seiner direkten Kinder:

realsize(f)+realsize(f2)+realsize(f3)+realsize(f4)+realsize(f5)+realsize(fa)+realsize(fa2)

 folgendes Ergebnis: 4096+4096+4096+4096+4096+4096+0 = 24576

noname@pb:~/todel/linktest$ echo $((4096*6))
24576

Ein nachträgliches befüllen von existierenden Unterordnern ändert nichts an dieser Summe!

Hier am Beispiel des Unterordners f vom betrachteten Ordner e.

Wie man hier sieht, ist der Ordner zu Anfang leer gewesen:

noname@pb:~/todel/linktest$ ls -l --block-size="1" a/b/c/d/e/f
total 0

Jetzt erzeugen wir eine Sparse Datei darin:

noname@pb:~/todel/linktest$ dd if=/dev/zero of=a/b/c/d/e/f/fa3 bs=1k seek=4000k count=1
1+0 Datensätze ein
1+0 Datensätze aus
1024 bytes (1,0 kB, 1,0 KiB) copied, 0,000475806 s, 2,2 MB/s
noname@pb:~/todel/linktest$ du -B 1 --apparent-size a/b/c/d/e/f/fa3
4194305024    a/b/c/d/e/f/fa3
noname@pb:~/todel/linktest$ du -B 1 a/b/c/d/e/f/fa3
4096    a/b/c/d/e/f/fa3
noname@pb:~/todel/linktest$ ls -l --block-size="1" a/b/c/d/e/f
total 4096
-rw-r--r-- 1 noname noname 4194305024 Apr  2 13:57 fa3
 

Die Ursprüngliche Ausgabe von ls für der Ordner e bleibt von dieser Änderung unberührt:

noname@pb:~/todel/linktest$ ls -l --block-size="1" a/b/c/d/e
total 24576
drwxr-xr-x 2 noname noname       4096 Apr  2 13:29 f
drwxr-xr-x 2 noname noname       4096 Apr  2 13:25 f2
drwxr-xr-x 2 noname noname       4096 Apr  2 13:26 f3
drwxr-xr-x 2 noname noname       4096 Apr  2 13:28 f4
drwxr-xr-x 4 noname noname       4096 Apr  2 13:31 f5
-rw-r--r-- 1 noname noname 4194305024 Apr  2 13:52 fa
-rw-r--r-- 1 noname noname          0 Apr  2 13:28 fa2

 

Keine Kommentare:

Kommentar veröffentlichen