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

74

Esta pergunta já tem uma resposta aqui:

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

Daryl Spitzer
fonte
2
você pode usar a -kopção para usar o tamanho de bloco de 1
KB de
Eu só quero recomendar este software gratuito chamado Disk Inventory X. baixá-lo aqui derlien.com é simples de usar para Mac OSX
Nimitack
Em vez de du, eu uso ncdu, você pode encontrar a referência aqui, remysharp.com/2018/08/23/cli-improved
Alan Dong

Respostas:

82

A versão BSD duusada no OS X relata o tamanho com blocos de 512 bytes - os tamanhos são essencialmente 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ê tiver muitos arquivos pequenos, a diferença pode ser grande.

Aqui está um exemplo.

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

$ du -s
248   .

O -hsinalizador 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 finde awkfornecer 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

Este valor corresponde exatamente ao número informado pela janela Obter informações do Finder. (Não há garfos ou xattrs estranhos nesse conjunto de arquivos.) É significativamente menor que o valor relatado por du.

Eis 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 fsinalizador existe para que apenas os arquivos (e não os diretórios) sejam enviados ls. Sem esse sinalizador, ele também enviará nomes de diretório para ls, e cada arquivo será listado duas vezes: uma como um arquivo individual e outra como um item no diretório.

A versão GNU de dupode fornecer valores em bytes reais, em vez de blocos. É lamentável que a versão do BSD dunão seja tão flexível.

wch
fonte
Ótima explicação. Curiosamente, ao usar a dupartir do GNU coreutils com a -bopção, recebo um resultado diferente do que com o seu findpipe. Para um diretório de 36 GB, obtenho uma diferença de 82 KB.
Stefan Schmidt
existe alguma maneira de imprimir isso em um formato mais legível para humanos?
precisa saber é o seguinte
75

Mostrar 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

Daryl Spitzer
fonte
25
du -schse você quiser algo mais fácil de ler.
13139 Joey
@ Johannes, acho que você deve postar este comentário como resposta, para que possa ser aceito?
Arjan
Acho a opção -c redundante (pelo menos no Mac OS X) e o du -sh suprime os subtotais.
Daryl Spitzer
Ah, eu não sabia que alguém podia aceitar a própria resposta. Agora, pelo menos, as pessoas sabem que a questão está resolvida.
Arjan
Felizmente, aceito uma nova resposta que é uma melhoria na minha.
Daryl Spitzer
9

du - informa ao disco que não usa 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) me oferece o melhor resultado e é muito mais rápido que "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
Ácido
fonte
Se você quiser fazer o mesmo no Ubuntu:find . -type f -print0 | xargs -0 stat -c%s | awk '{b+=$1} END {print b}'
Rodrigo Polo
existe uma maneira de obter esse resultado em um formato legível por humanos?
precisa saber é o seguinte
6

Você pode usar o du -ah .que exibe tamanhos de todos os arquivos e diretórios recursivamente.

Isso pode ser combinado com sort, para que você veja os 20 maiores diretórios da pasta atual:

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

Nota: Opção -hpara sortnão está disponível em OSX / BSD, por isso você tem que instalar sorta partir de coreutils(por exemplo, via brew) e aplicar o caminho bin para 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
kenorb
fonte
O primeiro comando não funciona no meu macOS 10.12.1 #du -ah. | classificar -rh | head -20 sort: opção inválida - h Tente `sort --help 'para obter mais informações.
nucleartux
3
@nucleartux Verifique a nota abaixo do comando. Isso funciona na classificação GNU, que você pode instalar no macOS via:, brew install coreutilscaso contrário, use o comando BSD sort no final sem -h.
kenorb
2

Combinei todas as suas aprovações e a 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 o gist: https://gist.github.com/mlegenhausen/9365461

malte
fonte