"Ls -lh" повідомляє про загальний розмір менше суми окремих розмірів


14

За яких обставин було б ls -lhвідображено загальну суму, меншу за суму окремих файлів? Наприклад:

$ 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

Редагувати: тепер показ додаткових прапорців на запит у коментарі:

$ 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

не знаю, чи є якесь із цих посилань, чи можете ви перерахувати ls -aiFlh
bsd

@bdowning Додано додаткові прапори. Зауважте, в каталозі відбулися деякі зміни, але проблеми все ще є
Лорін Хохштайн

Як щодо того du -h --totalж режисера?
bsd

Відповіді:


20

Це станеться, якщо у вас є розріджені файли:

$ 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

Рідкий файл - це файл, який не заповнений блоками файлової системи (або лише частково). Коли ви прочитаєте незаселену зону розрідженого файлу, ви отримаєте нулі. Такі порожні зони не потребують фактичного дискового простору, а "загальний", про який повідомляється, lsвідповідає простору диска, займаному файлами (так само du).


3
Образи вашого диска kvm, ймовірно, переповнені дірками :-)
Stéphane Gimenez

У документації на coreutils йдеться про те, що -s/ --sizeпараметр "Роздрукувати розподіл диска кожного файлу зліва від імені файлу. Це об'єм дискового простору, який використовується файлом, який, як правило, трохи перевищує розмір файлу, але він може бути менше, якщо у файлі є дірки . " -lВаріант звичайно друкує розмір теж.
Франческо Турко

2

Зверніть увагу, що результат, який дає ls -lі duмає тонку, але дуже важливу різницю. Спробуйте це:

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

Тепер

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

Тоді як

du -h aaa
4.0K    aaa

Це тому, що файлова система виділяє розмір у шматки 4096 (у моєму вікні linux). Він називається IO Block. Ви можете побачити це:

    stat aaa
  File: `aaa'
  Size: 1024        Blocks: 8          IO Block: 4096   regular file

Крім того, ви можете спробувати statзапропоновані мною пропозиції empty-file, і ви побачите, що кількість блоків дорівнює 0, навіть якщо файл повідомляється про розмір 1G.
Стефан Гіменез

@ StéphaneGimenez Чому він повідомляє про блоки як 8, хоча? Який це блок розміром 512 байт?
Анкур Агарвал

1
Це трохи дивно: У старі часи блоки IO мали розмір 512, але зараз вони зазвичай 4K. statповідомляє про еквівалентну кількість блоків старого розміру, необхідних для зберігання всіх блоків 4K (тобто в 8 разів більше від реальної кількості 4K блоків).
Стефан Гіменез

1

Прийнята відповідь абсолютно правильна, просто якщо ви хочете побачити видимий розмір, ви можете використовувати:

du --apparent-size

друкувати видимі розміри, а не використовувати диски; хоча очевидний розмір зазвичай менший, він може бути більшим через отвори у («розріджених») файлах, внутрішню фрагментацію, непрямі блоки тощо

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.