Diferença no cálculo do tamanho do diretório

9

Eu 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 de bloco tradicional do UNIX (512 bytes) e obtenho 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?

    
por Eimantas 01.09.2011 / 07:06

4 respostas

10

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

disk usage != sum of file sizes

Porque cada arquivo ocupa um número de blocos no sistema de arquivos (veja man mkfs.ext2 , por exemplo). Isso significa que apenas em uma situação muito rara um uso de disco de um arquivo é 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 um pode conter uma parte de apenas um arquivo.

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

Uma situação ainda mais interessante pode ocorrer, quando existem algumas no sistema de arquivos!

    
por 01.09.2011 / 08:48
2

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

  • Recebo as contagens de bytes para os números "quantificados" 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) e "quantificar" dividindo por 1000 e aumentando o prefixo de unidade (byte) 'quantificador' (magnitude) e fazendo alguns arredondamentos "off key". (Meu código completo está cheio de códigos de desenvolvimento fora de comentários e dividido em vários arquivos (e idiomas), por isso é difícil de compartilhar.) Até onde tenho visto, meus números "quantificados" são os mesmos que os números "quantificados" no Finder.
  • Além disso, juntamente com o código, quero dizer que não tenho (e nunca tive nenhuma) variável de ambiente BLOCKSIZE definida no meu shell, mas testei (agora, um pouco) as duas versões e os valores padrão para $BLOCKSIZE fornece os 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 me aproximo apenas contando arquivos (excluindo assim o diretório ~ 'sistema de arquivos meta index / header' ~ data) 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) parece contar os atributos estendidos ( xattr )

E então eu devo apenas trocadilho 'Corra o caminho e faça as contas'
Paz e boa noite, desta vez.

    
por 28.12.2011 / 04:24
1

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

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

Eu 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.

A identificação de cada tamanho de arquivo pode ser a melhor opção para um valor preciso do tamanho total do arquivo .

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

Para o OS X, se você não tiver o -b opton para 'du', você pode usar stat (se você tiver:) ... A linha comentada mostra o Ubuntu stat alternativa para du -b ;

unset total
while IFS= read -r -d $'
unset total
while IFS= read -r -d $'%pre%' rf; do
  # (( total += $(stat  "$rf" | sed -nre 's/^  Size: ([0-9]+).*//p') ))
    (( total += $(du -b "$rf" | cut -f 1) ))
done < <(find  . -type f  -name '*' -print0)
echo $total
' rf; do # (( total += $(stat "$rf" | sed -nre 's/^ Size: ([0-9]+).*//p') )) (( total += $(du -b "$rf" | cut -f 1) )) done < <(find . -type f -name '*' -print0) echo $total
    
por 01.09.2011 / 12:00
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}'

    
por 04.01.2015 / 17:07