Há muitas respostas aqui, muitas das quais são duplicadas. Vejo três tendências: passando por uma segunda ligação, usando código complicado de shell / awk e usando 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, acrescentando -x
para garantir que permaneçamos no mesmo sistema de arquivos (eu só preciso dessa operação quando tenho pouco espaço em disco, então por que eliminar as coisas que montei nessa árvore do FS ou movi e symlinked back?) e exibindo unidades constantes para facilitar a análise visual. Nesse caso, normalmente escolho não classificar para poder 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ê poderá anexá- | sort -n
lo se realmente quiser classificar os resultados.)
Isso filtra qualquer diretório cujo conteúdo (cumulativo) não exceda 512 MB e exibe tamanhos em gigabytes. Por padrão, du usa um tamanho de bloco de 512 bytes (a condição de 2 20 blocos do awk é de 512 MB e seu divisor 2 21 converte as unidades em GB - poderíamos usar du -kx
com $1 > 512*1024
e s/1024^2
ser mais legível por humanos). Dentro da condição awk, definimos s
o tamanho para removê-lo da linha ( $0
). Isso mantém o delimitador (que é recolhido em um único espaço); portanto, o final %s
representa um espaço e, em seguida, o nome do diretório agregado. %7s
alinha o %.2f
tamanho arredondado de 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 as soluções, incluindo esta, manuseiem incorretamente os nomes de diretórios que contêm quebras de linha).