Qual é a diferença entre du -h e ls -lh?

31

Estou tendo dificuldades para entender qual é a maneira correta de ler o tamanho dos arquivos, pois cada comando fornece resultados variados. Eu também me deparei com uma postagem em http://forums.devshed.com/linux-help-33/du-and-ls-generating-inconsistent-file-sizes-42169.html, que afirma o seguinte;

du fornece o tamanho do arquivo em que reside no sistema de arquivos. (O IE sempre fornecerá um resultado divisível por 1024).

ls lhe dará o tamanho real do arquivo.

O que você está vendo é a diferença entre o tamanho real do arquivo e a quantidade de espaço em disco que ele ocupa. (também chamado de eficiência do sistema de arquivos).

Qual é a diferença entre como ele reside no sistema de arquivos e o tamanho real do arquivo

AmendoimMacaco
fonte

Respostas:

48

Isso é chamado de espaço livre :

Cada camada de abstração sobre bits e bytes individuais resulta em espaço desperdiçado quando um arquivo de dados é menor que a menor unidade de dados que o sistema de arquivos é capaz de rastrear. Esse espaço desperdiçado em um setor, cluster ou bloco é geralmente chamado de espaço livre, e normalmente não pode ser usado para armazenamento de dados adicionais. Para setores individuais de 256 bytes, o espaço máximo desperdiçado é de 255 bytes. Para clusters de 64 kilobytes, o espaço máximo desperdiçado é 65.535 bytes.

Portanto, se seu sistema de arquivos alocar espaço em unidades de 64 KB e você armazenar um arquivo de 3 KB, então:

  • o tamanho real do arquivo é 3 KB.
  • o tamanho residente do arquivo é 64 KB, pois os 61 KB restantes nessa unidade não podem ser alocados para outro arquivo e, portanto, são perdidos.

Nota : Alguns sistemas de arquivos oferecem suporte à subalocação de bloco , o que ajuda a atenuar esse problema, atribuindo vários arquivos pequenos (ou os finais de arquivos grandes) ao mesmo bloco.

Faz-tudo5
fonte
11
Essa é uma ótima explicação.
precisa
11
@ Handyman5 - Obrigado Handyman5. Então, quando estou analisando o tamanho de um arquivo ou pasta usando ls, ele retorna o tamanho real enquanto du retorna o tamanho do residente? Isso está correto? Então, ao olhar para o tamanho do arquivo, qual é o mais preciso, ou seja, tamanho residente ou tamanho do arquivo ou é uma pergunta arbitrária?
PeanutsMonkey
8
@PeanutsMonkey, a precisão está nos olhos de quem vê. ;-) Basicamente, se você está preocupado com a quantidade de espaço que o arquivo ocuparia em outro lugar (como copiar pela rede, adicionar a um arquivo zip, fazer backup em uma unidade externa etc.), o tamanho real é o que Você se importa. Se você estiver preocupado com a quantidade de espaço restante na unidade em que o arquivo está agora, você se preocupa com o tamanho do residente. Como duestá mostrando o sábio disk u, ele está olhando para o espaço ocupado na unidade atual e, portanto, mostra o tamanho do residente.
Handyman5
11
@ Handyman5 - Passou quase um ano após o post, mas estou curioso para saber como a resposta acima difere ao usar df -h?
PeanutsMonkey
11
dfrelata o número de blocos restantes * o tamanho do bloco do sistema de arquivos. Nesse caso, seria mais parecido du, já que até os blocos parcialmente usados ​​são considerados totalmente alocados. dfbasicamente traduz statvfs , para que você possa ver a chamada do sistema para ter uma idéia melhor do que está acontecendo.
Handyman5
19

Há outra opção aqui, que não foi abordada - arquivos esparsos . Nesse caso, dumostrará um tamanho menor do que um simples ls -l, porque lsestá relatando o "tamanho" do arquivo como sendo o tamanho aparente (o número de bytes que você pode ler, se quiser muitos zeros), enquanto duvai continue usando o número real de blocos de disco em uso.

Truque divertido: crie muitos arquivos esparsos grandes e depois impressione seus amigos com quanto espaço em disco você tem ("veja, eu estou armazenando arquivos de 1 TB de onze gazilhões no meu disco rígido!"). OK, talvez não seja tão divertido então.

mulher
fonte
6

Os sistemas de arquivos são compostos de blocos. Os arquivos não precisam se encaixar perfeitamente em blocos. Se um arquivo tivesse 1024 bytes, o tamanho em ls e du seria 1024. Se o tamanho do arquivo fosse 1025, o tamanho seria 1025 em ls e 2048 em du.

Observe que o exemplo acima assume um tamanho de bloco de 1024. Tamanhos de bloco maiores são a norma atualmente e, g,

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

du -h fred
8.0K    fred
Iain
fonte
0

Ainda há mais uma razão pela qual eles podem ser diferentes. O du -h sabe quando vê o mesmo arquivo com outro nome (links físicos, ao contrário de links simbólicos) e reportará cada arquivo pelo tamanho, mas adicione o tamanho apenas uma vez ao diretório-pai comum.

Clifford Heath
fonte