Tutaj jest wiele odpowiedzi, z których wiele jest duplikatami. Widzę trzy trendy: przepuszczanie drugiego wywołania du, używanie skomplikowanego kodu powłoki / awk i używanie innych języków.
Oto rozwiązanie zgodne z POSIX, wykorzystujące du i awk, które powinno działać na każdym systemie.
Podjąłem nieco inne podejście, dodając, -x
aby upewnić się, że pozostajemy w tym samym systemie plików (potrzebuję tej operacji tylko wtedy, gdy brakuje mi miejsca na dysku, więc dlaczego usuwamy rzeczy, które zamontowałem w tym drzewie FS lub przeniosłem i symlinked back?) i wyświetlanie stałych jednostek, aby ułatwić wizualną analizę. W takim przypadku zazwyczaj nie sortuję, aby lepiej widzieć strukturę hierarchiczną.
sudo du -x | awk '
$1 > 2^20 { s=$1; $1=""; printf "%7sG%s\n", sprintf("%.2f",s/2^21), $0 }'
(Ponieważ jest to spójne jednostki, możesz następnie dołączyć, | sort -n
jeśli naprawdę chcesz posortować wyniki).
Spowoduje to odfiltrowanie dowolnego katalogu, którego (skumulowana) zawartość nie przekracza 512 MB, a następnie wyświetla rozmiary w gigabajtach. Standardowo stosuje du 512-bajtowy rozmiar bloku (czyli stan awk 2 20 bloków jest 512 oraz jej 2 21 dzielnik przetwarza jednostki z GB - można było skorzystać du -kx
z $1 > 512*1024
i s/1024^2
do bardziej czytelnej dla człowieka). Wewnątrz warunku awk ustawiamy s
rozmiar, abyśmy mogli go usunąć z linii ( $0
). Zachowuje to separator (zwinięty do pojedynczej spacji), więc finał %s
reprezentuje spację, a następnie nazwę zagregowanego katalogu. %7s
wyrównuje zaokrąglony %.2f
rozmiar GB (zwiększ, %8s
jeśli masz> 10 TB).
W przeciwieństwie do większości rozwiązań tutaj, to poprawnie obsługuje katalogi ze spacjami w nazwach (chociaż każde rozwiązanie, w tym jedno, będzie źle traktować nazwy katalogów zawierające podziały wierszy).