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?
Que comando devo usar para encontrar o tamanho de todos os ficheiros (recursivamente) num directório Linux ou Mac OS X?
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.
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
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
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
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