Was ist der Unterschied zwischen du -h und ls -lh?

31

Es fällt mir schwer zu verstehen, wie man die Größe der Dateien richtig liest, da jeder Befehl unterschiedliche Ergebnisse liefert. Ich bin auch auf einen Post unter http://forums.devshed.com/linux-help-33/du-and-ls-generating-inconsistent-file-sizes-42169.html gestoßen , in dem Folgendes angegeben ist:

du gibt die Größe der Datei an, die sich auf dem Dateisystem befindet. (IE gibt Ihnen immer ein Ergebnis, das durch 1024 teilbar ist).

ls gibt Ihnen die tatsächliche Größe der Datei an.

Was Sie sehen, ist der Unterschied zwischen der tatsächlichen Größe der Datei und dem Speicherplatz auf der Festplatte. (auch als Dateisystemeffizienz bezeichnet).

Was ist der Unterschied zwischen dem Dateisystem und der tatsächlichen Größe der Datei?

PeanutsMonkey
quelle

Antworten:

48

Dies nennt man " Slack Space" :

Jede Abstraktionsschicht über einzelnen Bits und Bytes führt zu Platzverschwendung, wenn eine Datendatei kleiner ist als die kleinste Dateneinheit, die das Dateisystem verfolgen kann. Dieser verschwendete Speicherplatz innerhalb eines Sektors, Clusters oder Blocks wird üblicherweise als Leerraum bezeichnet und kann normalerweise nicht zum Speichern zusätzlicher Daten verwendet werden. Für einzelne 256-Byte-Sektoren beträgt der maximal verschwendete Speicherplatz 255 Byte. Für 64-Kilobyte-Cluster beträgt der maximal verschwendete Speicherplatz 65.535 Byte.

Wenn Ihr Dateisystem also Speicherplatz in Einheiten von 64 KB zuweist und Sie eine 3-KB-Datei speichern, gilt Folgendes:

  • Die tatsächliche Größe der Datei beträgt 3 KB.
  • Die residente Größe der Datei beträgt 64 KB, da die verbleibenden 61 KB in dieser Einheit keiner anderen Datei zugeordnet werden können und somit verloren gehen.

Hinweis : Einige Dateisysteme unterstützen die Blockunterzuordnung. Dies hilft, dieses Problem zu beheben , indem mehrere kleine Dateien (oder die hinteren Enden großer Dateien) demselben Block zugewiesen werden .

Heimwerker5
quelle
1
Das ist eine verdammt gute Erklärung.
SpacemanSpiff
1
@ Handyman5 - Danke Handyman5. Wenn ich also die Größe einer Datei oder eines Ordners mit ls betrachte, gibt es die tatsächliche Größe zurück, während du die residente Größe zurückgibt? Ist das korrekt? Wenn Sie sich also die Größe der Datei ansehen, welche ist die genaueste, dh residente Größe oder Dateigröße, oder ist das eine willkürliche Frage?
PeanutsMonkey
8
@PeanutsMonkey, Genauigkeit liegt im Auge des Betrachters. ;-) Wenn Sie sich Gedanken darüber machen, wie viel Speicherplatz die Datei an einem anderen Ort belegen würde (z. B. Kopieren über das Netzwerk, Hinzufügen zu einer Zip-Datei, Sichern auf einem externen Laufwerk usw.), ist die tatsächliche Größe maßgeblich du kümmerst dich um. Wenn Sie sich Gedanken über den auf dem Laufwerk, auf dem sich die Datei befindet, verbleibenden Speicherplatz machen, ist Ihnen die Größe des Speichers wichtig. Da duIhnen der disk usage angezeigt wird , wird der auf dem aktuellen Laufwerk belegte Speicherplatz und somit die Größe des Bewohners angezeigt.
Handwerker5
1
@ Handyman5 - Es ist fast ein Jahr nach dem Post, aber bin gespannt, wie sich die Antwort oben bei der Verwendung unterscheidet df -h?
PeanutsMonkey
1
dfmeldet die Anzahl verbleibender Blöcke * die Blockgröße des Dateisystems. In diesem Fall ist dies eher der Fall du, da auch teilweise verwendete Blöcke als vollständig zugeordnet gelten. dfGrundsätzlich übersetzt statvfs , so dass Sie sich diesen Systemaufruf ansehen können, um eine bessere Vorstellung davon zu bekommen, was vor sich geht.
Handwerker5
19

Es gibt hier eine andere Option, die noch nicht behandelt wurde - Dateien mit geringer Dichte . In diesem Fall duwird zeigen , eine kleinere Größe als ein einfacher ls -lwäre, da lsmeldet die „Größe“ der Datei , wie das Wesen scheinbare Größe (die Anzahl der Bytes , die Sie lesen, wenn Sie eine ganze Menge Nullen wollte), während duWille Verwenden Sie weiterhin die tatsächliche Anzahl der verwendeten Festplattenblöcke.

Unterhaltsamer Trick: Erstellen Sie sehr viele große Dateien mit geringer Speicherkapazität und beeindrucken Sie Ihre Freunde mit dem verfügbaren Speicherplatz ("Ich speichere elf Millionen 1-TB-Dateien auf meiner Festplatte!"). OK, vielleicht macht es dann nicht so viel Spaß.

womble
quelle
6

Dateisysteme bestehen aus Blöcken. Dateien müssen nicht ordentlich in Blöcke passen. Wenn eine Datei 1024 Byte groß ist, wird sie in ls und du in 1024 angegeben. Wenn die Dateigröße 1025 ist, wird sie in ls und 2048 in du angegeben.

Beachten Sie, dass im obigen Beispiel eine Blockgröße von 1024 angenommen wird. Größere Blockgrößen sind heutzutage die Norm.

ls -l fred
-rw-r--r-- 1 iain users 1024 Jul 13 22:06 fred

du -h fred
8.0K    fred
Iain
quelle
0

Es gibt noch einen Grund, warum sie sich unterscheiden können. du -h weiß, wann dieselbe Datei unter einem anderen Namen angezeigt wird (harte Links im Gegensatz zu symbolischen Links) und meldet jede Datei als Größe, fügt sie jedoch nur einmal zum gemeinsamen übergeordneten Verzeichnis hinzu.

Clifford Heath
quelle