Como obtenho o tamanho de um diretório Linux ou Mac OS X a partir da linha de comando? [duplicado]

67

Qual comando eu uso para encontrar o tamanho de todos os arquivos (recursivamente) em um diretório Linux ou Mac OS X?

    
por Daryl Spitzer 13.08.2009 / 22:00

5 respostas

76

A versão BSD de du usada no tamanho de relatórios do OS X com blocos de 512 bytes - os tamanhos são arredondados para o próximo valor de 512 bytes. Isso informa o espaço no disco, que é maior que a quantidade de dados. Se você tem muitos arquivos pequenos, a diferença pode ser grande.

Aqui está um exemplo.

Este é o valor com du regular. Está em blocos de 512 bytes:

$ du -s
248   .

O sinalizador -h resulta em um número mais legível, em kilobytes. Como esperado, é metade do número de blocos de 512 bytes:

$ du -hs
124K  .

Por fim, você pode usar find e awk para obter a soma dos bytes reais nos arquivos. Isso é meio lento, mas funciona:

$ find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
60527

Esse valor corresponde exatamente ao número informado pela janela Obter Informações do Finder. (Não há nenhum forks ou xattrs estranhos neste conjunto de arquivos.) É significativamente menor que o valor reportado por du .

Veja como funciona: ele obtém uma lista de todos os arquivos e os passa para ls -l ; então awk é usado para contar os bytes. O -type f flag está lá para que apenas arquivos (e não diretórios) sejam enviados para ls . Sem esse sinalizador, ele também enviará nomes de diretório para ls , e cada arquivo será listado duas vezes: uma vez como um arquivo individual e uma vez como um item no diretório.

A versão GNU de du pode fornecer valores em bytes reais em vez de blocos. É lamentável que a versão BSD de du não seja tão flexível.

    
por 18.03.2012 / 06:54
73

Mostre o tamanho de um único arquivo

du -h path_to_a_file

Mostre o tamanho do conteúdo de um diretório, cada subdiretório e cada arquivo individual:

du -h path_to_a_directory

Mostre o tamanho do conteúdo de um diretório:

du -sh path_to_a_directory

    
por 13.08.2009 / 22:01
9

du - informa ao disco usar o tamanho do arquivo .

find . -type f -print0 | xargs -0 stat -f%z | awk '{b+=$1} END {print b}'

acima do código do terminal (im no osx 10.6) oferece-me o melhor resultado e é muito mais rápido que o "find ... -exec"

uma referência rápida

time find . -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}'
4744010970

real    0m0.086s
user    0m0.029s
sys 0m0.073s

time find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
4744010970

real    0m18.515s
user    0m2.929s
sys 0m9.339s
    
por 11.11.2013 / 23:31
5

Você pode usar du -ah . , que exibe tamanhos de todos os arquivos e diretórios de forma recursiva.

Isso pode ser combinado com sort , então você verá os 20 maiores diretórios na pasta atual:

du -ah . | sort -rh | head -20

Observação: a opção -h para sort não está disponível no OSX / BSD, portanto, instale sort de coreutils (por exemplo, via brew ) e aplique o caminho bin a PATH , por exemplo

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.

Caso contrário, use:

du -a . | sort -rn | head -20
    
por 05.03.2015 / 15:03
2

Combinei todas as suas conquistas e combinei com uma saída legível por humanos. O resultado é:

#!/bin/sh
find $1 -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}' | awk '{ sum=$1 ; hum[1024**3]="Gb";hum[1024**2]="Mb";hum[1024]="Kb"; for (x=1024**3; x>=1024; x/=1024){ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x];break } }}'

Link para a essência: link

    
por 05.03.2014 / 12:30