Como obter o tamanho físico de um arquivo no Linux?


12

Posso usar ls -lpara obter o tamanho lógico de um arquivo, mas existe uma maneira de obter o tamanho físico de um arquivo?


Por favor, defina o que você quer dizer com tamanho "físico".
— Jörg W Mittag

Respostas:


28

ls -lfornecerá o tamanho aparente do arquivo, que é o número de bytes que um programa leria se lesse o arquivo do início ao fim. dudaria a você o tamanho do arquivo "no disco".

Por padrão, dufornece o tamanho do arquivo em número de blocos de disco, mas você pode usar -hpara obter uma unidade legível por humanos. Veja também o manual dudo seu sistema.

Observe que, com o GNU coreutil du(provavelmente o que você tem no Linux), -bobter bytes implica a --apparent-sizeopção. Não é isso que você deseja usar para obter o número de bytes realmente usados ​​no disco. Em vez disso, use --block-size=1ou -B 1.

Com o GNU ls, você também pode fazer ls -s --block-size=1no arquivo. Isso fornecerá o mesmo número du -B 1do arquivo.


Exemplo:

$ ls -l file
-rw-r--r--  1 myself wheel  536870912 Apr  8 11:44 file

$ ls -lh file
-rw-r--r--  1 myself wheel   512M Apr  8 11:44 file

$ du -h file
24K    file

$ du -B 1 file
24576   file

$ ls -s --block-size=1 file
24576 file

Isso significa que este é um arquivo de 512 MB que ocupa cerca de 24 KB no disco. É um arquivo esparso (principalmente zeros que não são realmente gravados no disco, mas representados como "buracos" lógicos no arquivo). Arquivos esparsos são comuns ao trabalhar com arquivos grandes pré-alocados, por exemplo, imagens de disco para máquinas virtuais ou arquivos de troca etc. A criação de um arquivo esparso é rápida, enquanto o preenchimento de zeros é lento (e desnecessário).

Consulte também o manual fallocatedo seu sistema Linux.


Nesse caso, essa diferença é importante? você pode fazer um exemplo prático? Agradeço antecipadamente.
— D'Arcy Nader

1
@ D'ArcyNader Veja a resposta atualizada.
— Kusalananda

Corrija-me se eu entendi errado alguma coisa, mas parece que a primeira frase é o contrário: stackoverflow.com/a/31437673/3701431 du mostraria a quantidade de dados realmente lidos, enquanto lsmostra a extensão em que os setores do disco estão alocados.
— Sergiy Kolodyazhnyy 15/01/19

2
@SergiyKolodyazhnyy (desculpe-me por responder tarde) Não, dumostra a quantidade de disco atualmente em uso pelo arquivo, enquanto o tamanho aparente (tamanho lógico) mostrado por lsé quantos bytes um programa poderia ler a partir dele. Se o arquivo for escasso, alguns dos bytes lidos serão zeros, mas ainda assim serão entregues ao programa que os lê (mas não do disco).
— Kusalananda

Essa foi uma resposta muito boa.
— Lizardx

3

Eu recebo o tamanho do arquivo em bytes como este:

actualsize=$(du -b "${file}" | cut -f 1)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.