Como obter o tamanho de um arquivo ou diretório no Linux

Uma janela de terminal Linux em um laptop estilo Ubuntu.
Fatmawati Achmad Zaenuri / Shutterstock

Ao usar o ducomando Linux , você obtém o uso real do disco e o tamanho real de um arquivo ou diretório. Explicaremos por que esses valores não são iguais.

Uso real do disco e tamanho real

O tamanho de um arquivo e o espaço que ele ocupa no disco rígido raramente são iguais. O espaço em disco é alocado em blocos. Se um arquivo for menor do que um bloco, um bloco inteiro ainda será alocado para ele porque o sistema de arquivos não tem uma unidade menor de espaço para usar.

A menos que o tamanho de um arquivo seja um múltiplo exato de blocos, o espaço que ele usa no disco rígido deve sempre ser arredondado para o próximo bloco inteiro. Por exemplo, se um arquivo for maior que dois blocos, mas menor que três, ainda serão necessários três blocos de espaço para armazená-lo.

Duas medidas são usadas em relação ao tamanho do arquivo. O primeiro é o tamanho real do arquivo, que é o número de bytes de conteúdo que o compõe. O segundo é o tamanho efetivo do arquivo no disco rígido. Este é o número de blocos do sistema de arquivos necessários para armazenar esse arquivo.

Um exemplo

Vejamos um exemplo simples. Vamos redirecionar um único caractere em um arquivo para criar um pequeno arquivo:

echo "1"> geek.txt

O comando "echo" 1 "> geek.txt" em uma janela de terminal.

Agora, usaremos a lista de formatos longos,,  lspara verificar o comprimento do arquivo:

ls -l geek.txt

O comando "ls -l geek.txt" em uma janela de terminal.

O comprimento é o valor numérico que segue as dave dave  entradas, que é dois bytes. Por que são dois bytes quando enviamos apenas um caractere para o arquivo? Vamos dar uma olhada no que está acontecendo dentro do arquivo.

Usaremos o hexdumpcomando, que nos dará uma contagem exata de bytes e nos permitirá “ver” caracteres não imprimíveis como valores hexadecimais . Também usaremos a -Copção (canônica) para forçar a saída a mostrar valores hexadecimais no corpo da saída, bem como seus equivalentes de caracteres alfanuméricos:

hexdump -C geek.txt

O comando "hexdump -C geek.txt" em uma janela de terminal.

A saída nos mostra que, começando no deslocamento 00000000 no arquivo, há um byte que contém um valor hexadecimal de 31 e um outro que contém um valor hexadecimal de 0A. A parte direita da saída representa esses valores como caracteres alfanuméricos, sempre que possível.

Recomendado:  O que há de novo no Ubuntu 17.10 “Artful Aardvark”, disponível agora

O valor hexadecimal de 31 é usado para representar o dígito um. O valor hexadecimal de 0A é usado para representar o caractere Line Feed, que não pode ser mostrado como um caractere alfanumérico, portanto, é mostrado como um ponto (.). O caractere Line Feed é adicionado por echo. Por padrão,  echoinicia uma nova linha depois de exibir o texto que precisa ser escrito na janela do terminal.

Isso corresponde à saída de  ls e concorda com o comprimento do arquivo de dois bytes.

Agora, usaremos o ducomando para verificar o tamanho do arquivo:

du geek.txt

O comando "du geek.txt" em uma janela de terminal.

Diz que o tamanho é quatro, mas quatro de quê?

Existem blocos e, em seguida, existem blocos

Quando du relata o tamanho dos arquivos em blocos, o tamanho que ele usa depende de vários fatores. Você pode especificar qual tamanho de bloco deve ser usado na linha de comando. Se você não forçar o duuso de um tamanho de bloco específico, ele segue um conjunto de regras para decidir qual usar.

Primeiro, ele verifica as seguintes  variáveis ​​de ambiente:

  • DU_BLOCK_SIZE
  • TAMANHO DO BLOCO
  • TAMANHO DO BLOCO

Se algum deles existir, o tamanho do bloco será definido e a duverificação será interrompida. Se nenhum for definido, o  dupadrão é um tamanho de bloco de 1.024 bytes. A menos, ou seja, uma variável de ambiente chamada POSIXLY_CORRECTé definida. Se for esse o caso, o dupadrão é um tamanho de bloco de 512 bytes.

Então, como descobrimos qual está em uso? Você pode verificar cada variável de ambiente para resolvê-la, mas há uma maneira mais rápida. Vamos comparar os resultados com o tamanho do bloco que o sistema de arquivos usa.

Para descobrir o tamanho do bloco que o sistema de arquivos usa, usaremos o tune2fsprograma. Em seguida, usaremos a opção -l( listar superbloco ), canalizar a saída grepe, em seguida,  imprimir as linhas que contenham a palavra “Bloco”.

Neste exemplo, veremos o sistema de arquivos na primeira partição do primeiro disco rígido sda1, e precisaremos usar sudo:

sudo tune2fs -l / dev / sda1 | bloco grep

O comando "sudo tune2fs -l / dev / sda1 | grep Block" em uma janela de terminal.

O tamanho do bloco do sistema de arquivos é 4.096 bytes. Se dividirmos isso pelo resultado obtido de du (quatro), ele mostra que o  du tamanho do bloco padrão é 1.024 bytes. Agora sabemos várias coisas importantes.

Recomendado:  O que é um cabo Ethernet cruzado e quando você deve usá-lo?

Em primeiro lugar, sabemos que a menor quantidade de estado real do sistema de arquivos que pode ser dedicada ao armazenamento de um arquivo é 4.096 bytes. Isso significa que até mesmo nosso arquivo minúsculo de dois bytes está ocupando 4 KB de espaço no disco rígido.

A segunda coisa a ter em mente é aplicações dedicadas à elaboração de relatórios sobre as estatísticas do disco rígido e do sistema de arquivos, tais como du, lstune2fs, pode ter diferentes noções do que significa a “bloquear”. O tune2fsaplicativo relata tamanhos de bloco de sistema de arquivos reais, enquanto  lse dupode ser configurado ou forçado a usar outros tamanhos de bloco. Esses tamanhos de bloco não são relacionados ao tamanho do bloco do sistema de arquivos; eles são apenas “pedaços” que esses comandos usam em sua saída.

Finalmente, além de usar tamanhos de bloco diferentes, as respostas de due tune2fs transmitem o mesmo significado. O tune2fsresultado foi um bloco de 4.096 bytes e o duresultado foi quatro blocos de 1.024 bytes.

Usando du

Sem parâmetros ou opções de linha de comando, dulista o espaço total em disco que o diretório atual e todos os subdiretórios estão usando.

Vamos dar uma olhada em um exemplo:

du

O comando "du" em uma janela de terminal.

O tamanho é relatado no tamanho de bloco padrão de 1.024 bytes por bloco. Toda a árvore do subdiretório é percorrida.

Usando duem um diretório diferente

Se quiser  du relatar em um diretório diferente do atual, você pode passar o caminho para o diretório na linha de comando:

du ~ / .cach / evolution /

O comando "du ~ / .cach / evolution /" em uma janela de terminal.

Usando duem um arquivo específico

Se você deseja  du relatar sobre um arquivo específico, passe o caminho para esse arquivo na linha de comando. Você também pode passar um padrão de shell para selecionar um grupo de arquivos, como *.txt:

du ~ / .bash_aliases

O comando "du ~ / .bash_aliases" em uma janela de terminal.

Relatório sobre arquivos em diretórios

Para ter um durelatório sobre os arquivos no diretório e subdiretórios atuais, use a opção -a(todos os arquivos):

du -a

O comando "du -a" em uma janela de terminal.

Para cada diretório, o tamanho de cada arquivo é relatado, bem como um total para cada diretório.

Recomendado:  Como converter fotos HEIC para JPG no iPhone e iPad

Saída de um comando "du -a" em uma janela de terminal.

Limitando a profundidade da árvore de diretórios

Você pode dizer dupara listar a árvore de diretórios em uma certa profundidade. Para fazer isso, use a opção -d(profundidade máxima) e forneça um valor de profundidade como parâmetro. Observe que todos os subdiretórios são verificados e usados ​​para calcular os totais relatados, mas nem todos estão listados. Para definir uma profundidade máxima de diretório de um nível, use este comando:

du -d 1

O comando "du -d 1" em uma janela de terminal.

A saída lista o tamanho total desse subdiretório no diretório atual e também fornece um total para cada um.

Para listar diretórios um nível mais profundo, use este comando:

du -d 2

O comando "du -d 2" em uma janela de terminal.

Definindo o tamanho do bloco

Você pode usar a blockopção de definir um tamanho de bloco du para a operação atual. Para usar um tamanho de bloco de um byte, use o seguinte comando para obter os tamanhos exatos dos diretórios e arquivos:

du --block = 1

O comando "du --block = 1" em uma janela de terminal.

Se quiser usar um tamanho de bloco de um megabyte, você pode usar a -mopção (megabyte), que é o mesmo que --block=1M:

du -m

O comando "du -m" em uma janela de terminal.

Se você quiser que os tamanhos sejam relatados no tamanho de bloco mais apropriado de acordo com o espaço em disco usado pelos diretórios e arquivos, use a opção -h(legível):

du -h

O comando "du -h" em uma janela de terminal.

Para ver o tamanho aparente do arquivo em vez da quantidade de espaço no disco rígido usado para armazenar o arquivo, use a --apparent-sizeopção:

du - tamanho aparente

O comando "du --apparent-size" em uma janela de terminal.

Você pode combinar isso com a -aopção (todos) para ver o tamanho aparente de cada arquivo:

du --apparent-size -a

O comando "du --apparent-size -a" em uma janela de terminal.

Cada arquivo é listado, junto com seu tamanho aparente.

Saída do comando "du --apparent-size -a" em uma janela de terminal.

Exibindo apenas totais

Se você quiser  du relatar apenas o total do diretório, use a -sopção (resumir). Você também pode combinar isso com outras opções, como a opção -h(legível para humanos):

du -h -s

O comando "du -h -s" em uma janela de terminal.

Aqui, vamos usá-lo com a --apparent-sizeopção:

du --apparent-size -s

O comando "du --apparent-size -s" em uma janela de terminal.

Exibindo tempos de modificação

Para ver a hora e data de criação ou última modificação, use a --timeopção:

du --time -d 2

O comando "du --time -d 2" em uma janela de terminal.

Resultados estranhos?

Se você vir resultados estranhos du, especialmente quando fizer referência cruzada de tamanhos com a saída de outros comandos, geralmente é devido aos diferentes tamanhos de bloco para os quais diferentes comandos podem ser configurados ou aqueles para os quais eles são padrão. Também pode ser devido às diferenças entre os tamanhos reais dos arquivos e o espaço em disco necessário para armazená-los.

Se você precisar corresponder à saída de outros comandos, experimente a --blockopção em du.