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?


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.


Ó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


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

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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.