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?

user285003
fonte
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.

Kusalananda
fonte
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)
woohoo
fonte