"Ls -lh" gibt die Gesamtgröße kleiner als die Summe der Einzelgrößen an

14

Unter welchen Umständen würde sich ls -lheine Summe ergeben, die geringer ist als die Summe der einzelnen Dateien? Beispielsweise:

$ ls -lh /var/lib/nova/instances/_base
total 100G
-rw-rw-r-- 1 nova         nova 4.3M 2012-02-14 14:07 00000001
-rw-rw-r-- 1 nova         nova 5.7M 2012-02-14 14:07 00000002
-rw-rw-r-- 1 nova         nova  42G 2012-03-08 15:24 1574bddb75c78a6fd2251d61e2993b5146201319.part
-rw-rw-r-- 1 libvirt-qemu kvm   24M 2012-02-14 14:07 77de68daecd823babbb58edb1c8e14d7106e83bb_sm
-rw-r--r-- 1 libvirt-qemu kvm   65G 2012-03-02 12:43 bd307a3ec329e10a2cff8fb87480823da114f8f4
-rw-rw-r-- 1 libvirt-qemu kvm  160G 2012-02-24 16:06 ephemeral_0_160_None
-rw-rw-r-- 1 libvirt-qemu kvm   80G 2012-02-24 22:38 ephemeral_0_80_None
-rw-r--r-- 1 libvirt-qemu kvm   10G 2012-02-24 22:37 fe5dbbcea5ce7e2988b8c69bcfdfde8904aabc1f
-rw-r--r-- 1 libvirt-qemu kvm   10G 2012-02-24 11:09 fe5dbbcea5ce7e2988b8c69bcfdfde8904aabc1f_sm

Bearbeiten: jetzt werden auf Wunsch im Kommentar einige zusätzliche Flags angezeigt:

$ ls -aiFlh  /var/lib/nova/instances/_base/
total 143G
29884440 drwxrwxr-x 2 nova         nova 4.0K 2012-03-08 15:45 ./
29884427 drwxr-xr-x 6 nova         nova 4.0K 2012-03-08 15:05 ../
29884444 -rw-rw-r-- 1 nova         nova 4.3M 2012-02-14 14:07 00000001
29884445 -rw-rw-r-- 1 nova         nova 5.7M 2012-02-14 14:07 00000002
29884468 -rw-r--r-- 1 nova         nova  65G 2012-03-08 15:59 1574bddb75c78a6fd2251d61e2993b5146201319.converted
29884466 -rw-rw-r-- 1 nova         nova  58G 2012-03-08 15:35 1574bddb75c78a6fd2251d61e2993b5146201319.part
29884446 -rw-rw-r-- 1 libvirt-qemu kvm   24M 2012-02-14 14:07 77de68daecd823babbb58edb1c8e14d7106e83bb_sm
29884467 -rw-r--r-- 1 libvirt-qemu kvm   65G 2012-03-02 12:43 bd307a3ec329e10a2cff8fb87480823da114f8f4
29884443 -rw-rw-r-- 1 libvirt-qemu kvm  160G 2012-02-24 16:06 ephemeral_0_160_None
29884442 -rw-rw-r-- 1 libvirt-qemu kvm   80G 2012-02-24 22:38 ephemeral_0_80_None
29884447 -rw-r--r-- 1 libvirt-qemu kvm   10G 2012-02-24 22:37 fe5dbbcea5ce7e2988b8c69bcfdfde8904aabc1f
29884441 -rw-r--r-- 1 libvirt-qemu kvm   10G 2012-02-24 11:09 fe5dbbcea5ce7e2988b8c69bcfdfde8904aabc1f_sm
Lorin Hochstein
quelle
ls -aiFl
Ich
@bdowning Zusätzliche Flags hinzugefügt. Beachten Sie, dass einige Änderungen am Verzeichnis vorgenommen wurden, die Probleme jedoch weiterhin bestehen
Lorin Hochstein
Wie wäre es mit dem du -h --totalgleichen Verzeichnis?
bsd

Antworten:

20

Es wird passieren, wenn Sie spärliche Dateien haben:

$ mkdir test; cd test
$ truncate -s 1000000000 file-with-zeroes
$ ls -l
total 0
-rw-r--r-- 1 gim gim 1000000000 03-08 22:18 file-with-zeroes

Eine Sparse-Datei ist eine Datei, die nicht (oder nur teilweise) mit Dateisystemblöcken gefüllt wurde. Wenn Sie eine nicht aufgefüllte Zone einer Sparse-Datei lesen, erhalten Sie Nullen. Für solche leeren Zonen ist kein tatsächlicher Speicherplatz erforderlich, und die von angegebene Gesamtsumme lsentspricht dem von den Dateien belegten Speicherplatz (genau wie du).

Stéphane Gimenez
quelle
3
Ihre KVM-Disk-Images sind wahrscheinlich voller Löcher :-)
Stéphane Gimenez
Die coreutils-Dokumentation besagt, dass die Option " -s/ --size" die Datenträgerzuordnung jeder Datei links vom Dateinamen ausgibt. Dies ist der von der Datei belegte Speicherplatz, der normalerweise etwas größer ist als die Dateigröße, aber dies ist möglich weniger sein, wenn die Datei Löcher hat . " Die -lOption druckt natürlich auch die Größe.
Francesco Turco
2

Bitte beachten Sie, dass die Ausgabe von ls -lund dueinen subtilen, aber sehr wichtigen Unterschied aufweist. Versuche dies:

dd if=/dev/urandom of=aaa bs=1024 count=1

Jetzt

ls -l aaa
-rw-r--r-- 1 abc abc 1024 2012-03-08 15:45 aaa

Wohingegen

du -h aaa
4.0K    aaa

Dies liegt daran, dass das Dateisystem die Größe in Chunks von 4096 zuordnet (auf meiner Linux-Box). Es heißt IO Block. Sie können dies sehen, indem Sie:

    stat aaa
  File: `aaa'
  Size: 1024        Blocks: 8          IO Block: 4096   regular file
Ankur Agarwal
quelle
Sie können auch statmeinen Vorschlag anprobieren empty-fileund sehen, dass die Anzahl der Blöcke 0 ist, auch wenn die Datei eine Größe von 1 GB hat.
Stéphane Gimenez
@ StéphaneGimenez Warum werden Blöcke als 8 gemeldet? Welcher Block ist das mit Größe 512 Bytes?
Ankur Agarwal
1
Es ist ein bisschen seltsam. Früher hatten E / A-Blöcke die Größe 512, aber jetzt sind sie normalerweise 4 KB groß. statgibt die äquivalente Anzahl von Blöcken alter Größe an, die zum Speichern aller 4-KByte-Blöcke erforderlich sind (dh das Achtfache der tatsächlichen Anzahl von 4-KByte-Blöcken).
Stéphane Gimenez
1

Die akzeptierte Antwort ist absolut korrekt. Wenn Sie die scheinbare Größe sehen möchten, können Sie Folgendes verwenden:

du --apparent-size

scheinbare Größen statt Festplattennutzung drucken; Obwohl die scheinbare Größe normalerweise kleiner ist, kann sie aufgrund von Löchern in ("spärlichen") Dateien, interner Fragmentierung, indirekten Blöcken und dergleichen größer sein

Iman
quelle