"Ls -lh" informa tamanho total menor que a soma dos tamanhos individuais

14

Em que circunstâncias ls -lhmostraria um total menor que a soma dos arquivos individuais? Por exemplo:

$ 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

Edit: agora mostrando alguns sinalizadores extras são por solicitação no comentário:

$ 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
fonte
Não sei se qualquer um desses links, você poderia lista ls -aiFlh
BSD
@bdowning Adicionados os sinalizadores adicionais. Nota houve algumas alterações para o diretório, mas as questões ainda está lá
Lorin Hochstein
Que tal du -h --totalpara o mesmo diretório?
BSD

Respostas:

20

Isso acontecerá se você tiver arquivos esparsos:

$ 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

Um arquivo esparso é um arquivo que não foi preenchido com blocos do sistema de arquivos (ou apenas parcialmente). Quando você lê uma zona não preenchida de um arquivo esparso, obtém zeros. Essas zonas em branco não requerem espaço em disco real, e o 'total' relatado por lscorresponde ao espaço em disco ocupado pelos arquivos (exatamente como du).

Stéphane Gimenez
fonte
3
As imagens de disco KVM são provavelmente cheio de buracos :-)
Stéphane Gimenez
A documentação do coreutils diz que a opção -s/ --size"Imprime a alocação de disco de cada arquivo à esquerda do nome do arquivo. Essa é a quantidade de espaço em disco usada pelo arquivo, que geralmente é um pouco mais do que o tamanho do arquivo, mas pode será menor se o arquivo tiver falhas . " A -lopção, é claro, também imprime o tamanho.
Francesco Turco
2

Observe que a saída fornecida por ls -le dutem uma diferença sutil, mas muito importante. Tente o seguinte:

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

Agora

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

Enquanto que

du -h aaa
4.0K    aaa

Isso ocorre porque o sistema de arquivos aloca tamanho em pedaços de 4096 (na minha caixa linux). É chamado de bloco IO. Você pode ver isso por:

    stat aaa
  File: `aaa'
  Size: 1024        Blocks: 8          IO Block: 4096   regular file
Ankur Agarwal
fonte
Além disso, você pode experimentar o que stateu propus empty-filee verá que o número de blocos é 0, mesmo que o arquivo tenha um tamanho de 1G.
Stéphane Gimenez
@ StéphaneGimenez Por que ele informa Blocos como 8? Que bloco é esse com tamanho de 512 bytes?
Ankur Agarwal
1
É um pouco estranho. Antigamente, os blocos de E / S tinham tamanho 512, mas agora são geralmente em 4K. statrelata o número equivalente de blocos antigos necessários para armazenar todos os blocos de 4K (ou seja, 8 vezes o número real de blocos de 4K).
Stéphane Gimenez
1

A resposta aceita está absolutamente correta, apenas se você quiser ver o tamanho aparente, pode usar:

du --apparent-size

imprimir tamanhos aparentes, em vez de usar o disco; embora o tamanho aparente seja geralmente menor, ele pode ser maior devido a falhas nos arquivos ("esparsos"), fragmentação interna, blocos indiretos e similares

iman
fonte