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


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 Posten gestoßen http://forums.devshed.com/linux-help-33/du-and-ls-generating-inconsistent-file-sizes-42169.html was folgendes sagt;

du gibt dir die Größe der Datei, so wie sie sich im Dateisystem befindet. (IE Wille wird Ihnen immer ein Ergebnis geben, das durch 1024 teilbar ist).

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

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

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


28
2017-07-13 20:31


Ursprung




Antworten:


Das nennt man Schlaffraum:

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

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

  • die Dateien tatsächliche Größe ist 3 KB.
  • die Dateien Bewohnergröße ist 64 KB, da die verbleibenden 61 KB in dieser Einheit nicht einer anderen Datei zugeordnet werden können und somit verloren sind.

Hinweis: Einige Dateisysteme unterstützen Unterallokation blockieren, was dazu beiträgt, dieses Problem zu verringern, indem mehrere kleine Dateien (oder die Endstücke großer Dateien) demselben Block zugewiesen werden.


44
2017-07-13 20:41



Das ist eine verdammt gute Erklärung. - SpacemanSpiff
@ Handyman5 - Danke Handyman5. Wenn ich also die Größe einer Datei oder eines Ordners mit ls anschaue, gibt sie die tatsächliche Größe zurück, während du die resident size zurückliefert. Ist das korrekt? Wenn man sich also die Größe der Datei anschaut, welche ist die genaueste, d. H. Die residente Größe oder Dateigröße, oder ist das eine willkürliche Frage? - PeanutsMonkey
@ PeanutsMonkey, Genauigkeit liegt im Auge des Betrachters. ;-) Wenn Sie sich Sorgen darüber machen, wie viel Speicherplatz die Datei an anderer Stelle einnehmen würde (z. B. Kopieren über das Netzwerk, Hinzufügen zu einer Zip-Datei, Backup auf ein externes Laufwerk usw.), dann ist die tatsächliche Größe du kümmerst dich um. Wenn Sie sich mit dem Speicherplatz auf dem Laufwerk, auf dem sich die Datei befindet, beschäftigt haben, interessiert Sie die Größe des Benutzers. Schon seit du zeigt dir das dIsk uEs ist der Raum, der auf der aktuellen Fahrt aufge- nommen wurde, und so zeigt er Ihnen die Einwohnergröße. - Handyman5
@ Handyman5 - Danke Handyman5. Das war sehr hilfreich. - PeanutsMonkey
@ Handyman5 - Es ist fast ein Jahr nach dem Post, aber bin gespannt wie sich die obige Antwort unterscheidet df -h? - PeanutsMonkey


Es gibt eine andere Option hier, die nicht abgedeckt wurde - Sparse-Dateien. In diesem Fall, du wird eine kleinere Größe als eine einfache zeigen ls -l würde, weil ls meldet die "Größe" der Datei als die ersichtlich Größe (die Anzahl der Bytes, die Sie lesen könnten, wenn Sie eine ganze Menge von Nullen wollten), während du wird weiterhin die tatsächliche Anzahl der verwendeten Festplattenblöcke verwenden.

Spaß Trick: Erstellen Sie eine große Anzahl von großen Sparse-Dateien, und beeindrucken Sie Ihre Freunde mit dem Speicherplatz, den Sie haben ("guck mal, ich speichere ein paar Gigabyte 1TB-Dateien auf meiner Festplatte!"). OK, vielleicht nicht so lustig dann.


15
2017-07-13 23:22





Dateisysteme bestehen aus Blöcken. Dateien müssen nicht sauber in Blöcke passen. Wenn eine Datei 1024 Bytes groß ist, ist die Größe in ls und du wäre 1024. Wenn die Dateigröße 1025 wäre, wäre die Größe 1025 in ls und 2048 in du.

Beachten Sie, dass das obige Beispiel eine Blockgröße von 1024 annimmt. Größere Blockgrößen sind heutzutage die Norm e, g,

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

du -h fred
8.0K    fred

5
2017-07-14 07:33





Es gibt noch einen weiteren Grund, warum sie anders sein können. du -h weiß, wenn es die gleiche Datei unter einem anderen Namen (harte Links, im Gegensatz zu symbolischen Links) sieht und jede Datei für die Größe meldet, die es ist, aber nur die Größe einmal dem gemeinsamen übergeordneten Verzeichnis hinzufügen.


0