2009-08-13 20:00:15 +0000 2009-08-13 20:00:15 +0000
76
76

Como obter o tamanho de um directório Linux ou Mac OS X a partir da linha de comando?

Que comando devo usar para encontrar o tamanho de todos os ficheiros (recursivamente) num directório Linux ou Mac OS X?

Respostas (5)

83
83
83
2012-03-18 05:54:47 +0000

A versão BSD de du utilizada no tamanho de relatórios OS X com blocos de 512 bytes – os tamanhos são essencialmente arredondados para o próximo valor de 512 bytes. Isto diz-lhe o espaço no disco, que é maior do que a quantidade de dados. Se tiver muitos ficheiros pequenos, a diferença pode ser grande.

Aqui está um exemplo.

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

$ du -s
248 .

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

$ du -hs
124K .

Finalmente, pode usar find e awk para lhe dar a soma dos bytes reais nos ficheiros. Isto é um pouco lento, mas funciona:

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

Este valor corresponde exactamente ao número reportado pela janela Get Info do Finder. (Não há garfos ou xattrs estranhos neste conjunto de ficheiros.) É significativamente menor do que o valor reportado por du.

É assim que funciona: obtém uma lista de todos os ficheiros, e passa-os para ls -l; depois awk é usado para contar os bytes. A bandeira -type f está lá para que apenas os ficheiros (e não os directórios) sejam enviados para ls. Sem essa bandeira, também enviará nomes de directórios para ls, e cada ficheiro será listado duas vezes: uma como ficheiro individual, e outra como item no directório.

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

75
75
75
2009-08-13 20:01:52 +0000

Mostrar o tamanho de um único ficheiro

du -h path_to_a_file

Mostrar o tamanho do conteúdo de um directório, de cada subdirectório, e de cada ficheiro individual:

du -h path_to_a_directory

Mostrar o tamanho do conteúdo de uma directoria:

du -sh path_to_a_directory

9
9
9
2013-11-11 22:31:48 +0000

du - diz ao disk use e não ao file size.

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

acima do código terminal (im on osx 10.6) oferece-me o melhor resultado e é mais rápido do que “encontrar … -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
6
6
6
2015-03-05 14:03:07 +0000

Pode utilizar o du -ah . que mostra os tamanhos de todos os ficheiros e directórios de forma recorrente.

Isto pode ser combinado com sort, pelo que verá os top-20 maiores directórios da pasta actual:

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

Nota: A opção -h para sort não está disponível no OSX/BSD, pelo que terá de instalar sort a partir de coreutils (por exemplo, via brew) e aplicar o caminho do contentor de lixo a PATH, por exemplo,

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

Caso contrário, utilize:

du -a . | sort -rn | head -20
2
2
2
2014-03-05 11:30:06 +0000

Combinei todas as vossas aprovações e combinei-as com um resultado legível para o ser humano, 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: https://gist.github.com/mlegenhausen/9365461

Questões relacionadas

6
10
12
7
15