Há muitas respostas aqui, muitas das quais são duplicatas. Eu vejo três tendências: percorrer um segundo du call, usar código shell / awk complicado e usar outros idiomas.
Aqui está uma solução compatível com POSIX usando du e awk que deve funcionar em todos os sistemas.
Adotei uma abordagem um pouco diferente, adicionando -x
para garantir que permaneçamos no mesmo sistema de arquivos (eu só preciso dessa operação quando estou com pouco espaço em disco, então por que eliminar coisas que montei esta árvore de FS ou movido e symlinked de volta?) e exibindo unidades constantes para facilitar a análise visual. Nesse caso, eu geralmente escolho não para classificar, para que eu possa ver melhor a estrutura hierárquica.
sudo du -x | awk '
$1 > 2^20 { s=$1; $1=""; printf "%7sG%s\n", sprintf("%.2f",s/2^21), $0 }'
(Como isso está em unidades consistentes, você pode acrescentar | sort -n
se realmente quiser classificar ed resultados.)
Isso filtra qualquer diretório cujo conteúdo (cumulativo) não exceda 512 MB e, em seguida, exibe tamanhos em gigabytes. Por padrão, du usa um tamanho de bloco de 512 bytes (então a condição de 2 20 do awk é de 512MB e seu 2 21 divisor converte as unidades para GB - poderíamos usar du -kx
com $1 > 512*1024
e s/1024^2
para ser mais legível por humanos). Dentro da condição do awk, definimos s
para o tamanho para que possamos removê-lo da linha ( $0
). Isso retém o delimitador (que é reduzido a um único espaço), portanto, o% final %s
representa um espaço e, em seguida, o nome do diretório agregado. %7s
alinha o tamanho arredondado do %.2f
GB (aumente para %8s
se você tiver > 10 TB).
Diferentemente da maioria das soluções aqui, isso suporta diretórios com espaços em seus nomes (embora todas soluções, incluindo esta, manipularão incorretamente nomes de diretório contendo quebras de linha) .