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

307

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

Se eu usar df, obtenho o tamanho de cada sistema de arquivos montado, mas isso também não me ajuda. E com duo 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 na pasta ROOT do sistema de arquivos. Existe algum comando para conseguir isso?

2ndkauboy
fonte
A --totalbandeira foi útil para mim. Por exemplo du -sh --total applications/*. askubuntu.com/a/465436/48214
Ryan

Respostas:

433

Isso faz o que você está procurando:

du -sh /*

O que isto significa:

  • -s para fornecer apenas o total para cada argumento da linha de comando.
  • -hpara sufixos legíveis por humanos, como Mmegabytes e Ggigabytes (opcional).
  • /*simplesmente se expande para todos os diretórios (e arquivos) em /.

    Nota: dotfiles não estão incluídos; corra shopt -s dotglobpara incluí-los também.

Também é útil classificar por tamanho:

du -sh /* | sort -h

Aqui:

  • -hgarante que sortinterpreta os sufixos legíveis por humanos corretamente.
Thomas
fonte
8
Se você possui diretórios de ponto no diretório raiz, pode shopt -s dotglobincluí-los na contagem.
Philipp
8
É muito útil, porque é simples e você pode colocar o caminho que deseja /*, por exemplo, ./para o diretório atual ou ./*para cada item no diretório atual.
Ps
3
@psur ou você pode usar ./*/para obter apenas subpastas e nem todos os itens
relascópio
7
Classificação ordenada:du -sh /* | sort -h
Vu Anh
2
@ c1phr Se você sortnão possui -h, você também deve deixá-lo de fora du, caso contrário a classificação misturará quilo / mega / gigabytes. du -s /* | sort -nr.
Thomas
79

Muitas vezes, preciso encontrar os maiores diretórios; portanto, para obter uma lista classificada com os 20 maiores diretórios, faço isso:

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

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

Janne Pikkarainen
fonte
11
Aqui está uma maneira de torná-lo mais legível du -sh / some / path | classificar -hr | head -n 20
Xedecimal 08/07
6
@ Xedecima o problema de usar h é do tipo que não sabe lidar com tamanhos diferentes. Por exemplo, 268K é classificado com mais de 255M e ambos são classificados com mais de 2,7G
chrisan
4
O argumento -h (legível por humanos) no comando 'classificar' deve ler corretamente esses valores. Assim como a bandeira do du-h as exporta. Dependendo do que você está executando, eu acho.
Xedecimal
Funciona no Ubuntu 16.04. Boa dica.
precisa saber é o seguinte
sudo du -haxt 1G / | classificar -hr | head -30
deviant
22

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

BuddhaLincoln
fonte
Impressionante. Palavras-chave: du meet ncurses. Você pode usar bpara soltar em um shell no diretório
Ciro Santilli adicionou
11

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

  1. Loop muito básico, mas para mim esse foi um bom começo para algumas operações relacionadas a outros tamanhos:

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

    du -sh ./*
    
Martin
fonte
for eachnão funciona, pois anexa caracteres do console (por exemplo \033[) à lista de pastas
machineaddict
@machineaddict não sei o que você quer dizer. Eu uso isso o tempo todo, funciona muito bem para mim.
Martin
tente executar seu comando começando com for each. não vai funcionar
machineaddict
Eu executo o comando exatamente como está escrito aqui. começando com para cada um. trabalho.
Martin
7

A duchamada a seguir deve funcionar em sistemas BSD:

du -d 1 /
Philipp
fonte
1
Meu du(Ubuntu 10.4) não tem uma -dopção. Em que sistema você está?
Thomas
No meu openSUSE, ele também não possui a opção -d :(
2ndkauboy
OK, então é apenas uma opção BSD (estou no OS X).
Philipp
A combinação certa de opções portáteis no BSD / * NIX é du -sk /*. Eu odeio as -kcoisas muuuuito. O Linux é -htotalmente legal.
Dummy00001
em outros sistemas, o seu--max-depth
Vishnu Kumar
4

Isso não é fácil. O ducomando mostra arquivos e pastas (padrão) ou apenas os tamanhos de todos os itens especificados na linha de comando (opção -s).

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

du -h | sort -h

Isso o enterrará em vários arquivos pequenos. 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 ponto ocultas (pastas que começam com .).

Se você realmente deseja apenas as pastas, precisa usá-las, findmas isso pode ser muito, muito lento, pois duserá necessário digitalizar várias pastas várias vezes:

find . -type d -print0 | sort -z | xargs --null -I '{}' du -sh '{}' | sort -h
Aaron Digulla
fonte
1
--threshold ^^^ esta opção não está disponível no linux
podarok 6/15
1
@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
1
O armazenamento em cache pode ter sido um termo ruim. Eu estava pensando em algo parecido com o feito nesta porta superuser.com/a/597173/121352, na qual digitalizamos o conteúdo dos discos uma vez em um mapeamento e continuamos usando os dados desse mapeamento em vez de acessar o disco novamente.
Hennes 12/01
1

Esteja ciente de que você não pode comparar diretórios com dusistemas / máquinas diferentes sem ter certeza, ambos compartilham o mesmo tamanho de bloco do sistema de arquivos. Isso pode contar se você sincronizar novamente alguns arquivos de uma máquina linux para um nas e desejar comparar o diretório sincronizado por conta própria. Você pode obter resultados diferentes dudevido a diferentes tamanhos de bloco ....

Jimmy Koerting
fonte
0

Você também pode querer verificar xdiskusage . Irá fornecer a mesma informação, mas mostrada graficamente, além de permitir a pesquisa detalhada (muito útil). Existem outros utilitários semelhantes para o KDE e até o Windows.

sleske
fonte
0

Você pode usar lsem conjunto com awk:

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

A saída de lsé canalizada para awk. awkcomeça a processar os dados. Delimitador padrão é espaço. A variável sum toté inicializada como zero; a seguinte instrução é executada para cada linha / linha emitida por ls. Apenas incrementa totcom o tamanho. $5significa quinta coluna (produzido 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 arquivo.

Se você quiser informações gerais do sistema, kdirstatpode ser útil!

JM Stoorvogel
fonte
Concordo que se possa expandir este exemplo e fazer truques como obter o tamanho de "certos subconjuntos de diretórios, de acordo com os tipos de arquivo" 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, recomendo a leitura de respostas e comentários para esta pergunta , bem como para o artigo vinculado . Eu não digo que você não pode fazer nada. Conheça as limitações, só isso.
Kamil Maciorowski