Questão Como obter os tamanhos resumidos dos diretórios e seus subdiretórios?


Digamos que eu queira obter o tamanho de cada diretório de um sistema de arquivos do Linux. Quando eu uso ls -la Eu realmente não entendo o tamanho resumido das pastas.

Se eu usar df Eu recebo o tamanho de cada sistema de arquivos montado, mas isso também não me ajuda. E com du Eu recebo o tamanho de cada subdiretório e o resumo de todo o sistema de arquivos.

Mas eu quero ter apenas o tamanho resumido de cada diretório dentro da pasta ROOT do sistema de arquivos. Existe algum comando para conseguir isso?


258


origem


o --total bandeira foi útil para mim. Por exemplo. du -sh --total applications/*. askubuntu.com/a/465436/48214 - Ryan


Respostas:


Isso faz o que você está procurando:

du -sh /*

O que isto significa:

  • -s para dar apenas o total para cada argumento de linha de comando.
  • -h para sufixos legíveis como M para megabytes e G para gigabytes (opcional).
  • /* simplesmente se expande para todos os diretórios (e arquivos) /.

    Nota: dotfiles não estão incluídos; corre shopt -s dotglob para incluir esses também.

Também é útil classificar por tamanho:

du -sh /* | sort -h

Aqui:

  • -h Assegura que sort interpreta os sufixos legíveis corretamente.

366



Se você tiver diretórios de pontos no diretório raiz, poderá usar shopt -s dotglob incluí-los na contagem. - Philipp
É muito útil, porque é simples e você pode colocar o caminho que você quer em vez de /*, por exemplo. ./ para o diretório atual ou ./* para cada item no diretório atual. - psur
@psur ou você pode usar ./*/ para obter apenas subpastas e nem todos os itens - relascope
Versão ordenada: du -sh /* | sort -h - Vu Anh
@ c1phr Se o seu sort não tem -h, você precisa deixar de du também, caso contrário, a classificação irá misturar até kilo / mega / gigabytes. du -s /* | sort -nr. - Thomas


Eu frequentemente preciso encontrar os maiores diretórios, então para obter uma lista ordenada contendo os 20 maiores diretórios eu faço isso:

du -m /some/path | sort -nr | head -n 20

Nesse caso, os tamanhos serão informados em megabytes.


70



Aqui está uma maneira de torná-lo mais legível du -sh / some / path | ordenar -hr | cabeça -n 20 - Xedecimal
@Xedecima o problema com o uso de h é o tipo não sabe como lidar com tamanhos diferentes. Por exemplo, 268K é classificado acima de 255M e ambos são classificados acima de 2,7G - chrisan
O argumento -h (legível por humanos) no comando 'sort' deve ler corretamente esses valores. Assim como a bandeira de duh exporta-os. Dependendo do que você está correndo eu estou supondo. - Xedecimal
Funciona no Ubuntu 16.04. Boa dica. - SDsolar


Eu gosto de usar Ncdu para isso, você pode usar o cursor para navegar e detalhar a estrutura de diretórios que funciona muito bem.


14





As respostas existentes são muito úteis, talvez algum iniciante (como eu) também ache isso útil.

  1. Loop muito básico, mas para mim isso foi um bom começo para outras operações relacionadas ao tamanho:

    for each in $(ls) ; do du -hs "$each" ; done
    
  2. Muito semelhante à primeira resposta e quase o mesmo resultado de 1.), mas levei algum tempo para entender a diferença de * para ./* se em um subdiretório:

    du -sh ./*
    

9





Os seguintes du a invocação deve funcionar em sistemas BSD:

du -d 1 /

6



Minhas du (Ubuntu 10.4) não tem um -d opção. Em qual sistema você está? - Thomas
No meu openSUSE ele também não tem uma opção -d :( - 2ndkauboy
OK, então é apenas uma opção BSD (estou no OS X). - Philipp
Combinação de opção portátil direita em BSD / * NIX é du -sk /*. Eu odeio o -k coisas muuuuito muito. Linux ' -h totalmente rochas. - Dummy00001
em outros sistemas, --max-depth - Vishnu Kumar


Isso não é fácil. o du comando mostra arquivos e pastas (padrão) ou apenas os tamanhos de todos os itens que você especificar na linha de comando (opção -s).

Para obter os maiores itens (arquivos e pastas), classificados, com tamanhos legíveis em humanos no Linux:

du -h | sort -h

Isso vai te enterrar em uma tonelada de pequenos arquivos. Você pode se livrar deles com --threshold (1 MB no meu exemplo):

du --threshold=1M -h | sort -h

A vantagem deste comando é que ele inclui pastas de pontos ocultos (pastas que começam com .).

Se você realmente quer apenas as pastas, você precisa usar find mas isso pode ser muito, muito lento desde du terá que digitalizar muitas pastas várias vezes:

find . -type d -print0 | sort -z | xargs --null -I '{}' du -sh '{}' | sort -h

3



- limiar ^^^ esta opção não está disponível no linux - podarok
@podarok Está disponível no OpenSUSE 13.2 Linux. Tente encontrar uma versão mais recente da sua distribuição ou compile você mesmo uma versão mais recente do pacote. - Aaron Digulla
Não funciona no Ubuntu LTS (14.04). É o mais recente)) - podarok
@podarok Qual versão do GNU coreutils? O meu é 8,24. - Aaron Digulla
O cache pode ter sido um termo ruim. Eu estava pensando em algo como feito neste porto superuser.com/a/597173/121352 onde verificamos o conteúdo dos discos uma vez em um mapeamento e, em seguida, continuamos usando dados desse mapeamento em vez de bater no disco novamente. - Hennes


Esteja ciente de que você não pode comparar diretórios com du em sistemas / máquinas diferentes sem ter certeza, ambos compartilham o mesmo tamanho de bloco do sistema de arquivos. Isso pode contar se você rsync alguns arquivos de uma máquina Linux para um nas e você deseja comparar o diretório sincronizado em seu próprio país. Você pode obter resultados diferentes com du por causa de diferentes blocos ....


1





Você também pode querer dar uma olhada xdiskusage. Irá dar-lhe a mesma informação, mas mostrada graficamente, mais permite detalhar (muito útil). Existem outros utilitários semelhantes para o KDE e até para o Windows.


0





Você poderia usar ls em conjunção com awk:

ls -al * | awk 'BEGIN {tot=0;} {tot = tot + $5;} END {printf ("%.2fMb\n",tot/1024/1024);}'

A saída de ls é canalizado para awk. awk começa a processar os dados. O delimitador padrão é o espaço. A variável soma tot é inicializado para zero; a seguinte declaração é executada para cada linha / linha produzida por ls. Apenas incrementa tot com o tamanho. $5 significa quinta coluna (produzida por ls). No final, dividimos por (1024 * 1024) para somar em megabytes.

Se você converter isso em um script ou função (.bashrc), também poderá usá-lo para obter o tamanho de certos subconjuntos de diretórios, de acordo com os tipos de arquivos.

Se você quiser informações de todo o sistema, kdirstat pode vir a calhar!


0



Concordo que se pode expandir este exemplo e fazer truques como obter o tamanho de "certos subconjuntos de diretórios, de acordo com os tipos de arquivos" etc .; Pode parecer um bom ponto de partida. No entanto, esta solução é falha desde o início. Para todos os usuários que gostariam de usar esse método, eu recomendo ler respostas e comentários para essa questão assim como o artigo ligado. Eu não digo que você não pode fazer nada. Conheça as limitações, isso é tudo. - Kamil Maciorowski