Diferença de cálculo de tamanho de diretório

9

Preciso obter o tamanho do diretório no terminal para fins de assinatura. Estou usando o seguinte comando:

du -s /path/to/dir

Estou multiplicando o resultado pelo tamanho tradicional do bloco UNIX (512 bytes) e obtendo o tamanho real do diretório em bytes. No entanto, a janela de diálogo "Obter informações" do Finder mostra o tamanho um pouco menor que o calculado com o comando terminal. E parece que é reproduzível em qualquer pasta / pacote. o que estou perdendo?

Eimantas
fonte

Respostas:

11

Normalmente, dumostra informações sobre o uso do disco (de onde vem o nome). Tenha em mente que

disk usage != sum of file sizes

Porque cada arquivo ocupa vários blocos no sistema de arquivos (veja, man mkfs.ext2por exemplo). Isso significa que somente em uma situação muito rara o uso de um arquivo em disco é igual ao tamanho real - para isso, o tamanho deve ser exatamente um múltiplo do tamanho do bloco.

Pense nos blocos do sistema de arquivos como caixas que contêm partes de arquivos - cada uma pode conter parte de apenas um arquivo.

Para a versão GNU de du, confira a --apparent-sizeopção.


Uma situação ainda mais interessante pode ocorrer quando há alguns arquivos esparsos no sistema de arquivos!

rozcietrzewiacz
fonte
Não existe essa opção (estou no OS X, não no Linux). Provavelmente necessário mencionar que em uma questão, uma vez tag não é suficiente).
Eimantas
Ah, certo ... Então dê uma olhada na página de manual e tente encontrar referências a actualou apparent. (Veja também minha explicação atualizada).
rozcietrzewiacz
2
Correto, exceto pela desigualdade. Às vezes, os tamanhos de arquivo podem ser maiores que o espaço em disco real necessário para armazená-los. ( unix.stackexchange.com/q/33801/9426 )
Stéphane Gimenez #
@ StéphaneGimenez Wow ... obrigado por me dizer!
rozcietrzewiacz
2

Sobre o Mac OS X e o Finder (no Snow Leopard, versão 10.6.8), observei o seguinte.

  • Recebo a contagem de bytes para as figuras 'quantificadas' do Finder de um caminho (arquivo ou pasta) com o código (em bash(1)) abaixo.
  • As janelas e o painel "Informações" do Finder mostram os números 'quantificados' (por exemplo, quilo em KB) em bytes decimais (base 10, 1000), em oposição aos bytes binários (base 2, 1024), para que eu 'quantifique' dividindo por 1000 e aumentando o prefixo da unidade (byte) 'quantifier' (magnitude) e faça alguns arredondamentos "fora da tecla". (Meu código completo está cheio de código de desenvolvimento comentado e dividido em vários arquivos (e idiomas), por isso é difícil de compartilhar.)
    Até agora, vi que meus números 'quantificados' são iguais aos números 'quantificados' no Finder .
  • Além disso, junto com o código, quero dizer que não tenho (e nunca tive) variável de ambiente BLOCKSIZEdefinida no meu shell, mas testei (agora um pouco) as versões e os valores padrão para $BLOCKSIZEos mesmos valores.

#!/usr/bin/env bash
#tab-width:4
                                 du -s                      "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-0512}'   }'||exit $?         #macosx  (xnu)
#                               gdu -sB${BLOCKSIZE:-4096}   "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-4096}'   }'||exit $?         #macports gnu

  • O número não quantificado que não consegui corresponder.
    A única coisa que posso dizer é que eu me aproximo apenas contando arquivos (excluindo assim o diretório ~ 'meta-index / cabeçalho do sistema de arquivos' ~ dados) e que o mais próximo que eu chego é o seguinte.

#!/usr/bin/env bash
#tab-width:4
    for a;do find "$a" -type f -print0|xargs -0      stat -f %z         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macosx  (xnu)
#   for a;do find "$a" -type f -print0|xargs -0     gstat -c %s         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macports gnu
  • Nem (xnu) du(1) nem (gnu) gdu(1) parecem contar atributos estendidos ( xattr)

E então eu devo apenas trocadilho 'Run o caminho e fazer a matemática'
Paz para fora e boa noite fo'real desta vez.

vike
fonte
1

No meu sistema Ubuntu, usando ext4, du -b filefornece o tamanho em bytes de um arquivo real e du -b diro tamanho em bytes do (s) arquivo (s) + sobrecarga de diretório. A sobrecarga é, no meu caso, múltiplos de 4096 bytes.

Essa sobrecarga aumenta à medida que o número de arquivos aumenta.
Nota: mesmo se os arquivos forem excluídos, a sobrecarga do diretório permanecerá no nível mais alto em que estava antes dos arquivos serem excluídos.

Não tentei reiniciar, para ver se ele reverte, mas em ambos os casos, isso significa que o tamanho do diretório varia dependendo das circunstâncias históricas.

Classificar o tamanho de cada arquivo pode ser a melhor opção para obter um valor exato do tamanho total dos arquivos .

O script a seguir totaliza todos os tamanhos de arquivo (em bytes).

Para o OS X, se você não tiver o -bopton para 'du', poderá usá-lo stat. (Se tiver:) ... A linha comentada mostra a statalternativa do Ubuntu para du -b;

unset total
while IFS= read -r -d $'\0' rf; do
  # (( total += $(stat  "$rf" | sed -nre 's/^  Size: ([0-9]+).*/\1/p') ))
    (( total += $(du -b "$rf" | cut -f 1) ))
done < <(find  . -type f  -name '*' -print0)
echo $total
Peter.O
fonte
2
OSX não temdu -b e um diferentestat . Seu script não é portátil fora do Linux de qualquer maneira.
Gilles 'SO- stop be evil'
Com o MacPorts no OS X, você pode instalar coreutilspara obter a versão GNU do duas gdu. Portanto, não é exatamente portátil, mas pode ser útil para as pessoas no OS X obterem as versões GNU de alguns utilitários principais.
perfil completo de drfrogsplat
1

Soma todos os arquivos em um diretório:

OSX: find dir ! -type d -print0 | xargs -0 stat -f '%z' | awk '{sum += $1} END{print sum}'

Linux: find dir ! -type d -printf "%s\n" | awk '{sum += $1} END{print sum}'

cristão
fonte
find: unrecognized: -printf. Alpine image
gadelat 14/04