Jak uzyskać podsumowane rozmiary katalogów i ich podkatalogów?

307

Powiedzmy, że chcę uzyskać rozmiar każdego katalogu systemu plików Linux. Kiedy używam ls -la, tak naprawdę nie otrzymuję podsumowanego rozmiaru folderów.

Jeśli używam df, otrzymuję rozmiar każdego podłączonego systemu plików, ale to też mi nie pomaga. I dzięki duotrzymuję rozmiar każdego podkatalogu i podsumowanie całego systemu plików.

Ale chcę mieć tylko podsumowany rozmiar każdego katalogu w folderze ROOT systemu plików. Czy jest jakieś polecenie, aby to osiągnąć?

2ndkauboy
źródło
--totalFlag było pomocne dla mnie. Np du -sh --total applications/*. askubuntu.com/a/465436/48214
Ryan

Odpowiedzi:

433

Robi to, czego szukasz:

du -sh /*

Co to znaczy:

  • -s aby podać tylko sumę dla każdego argumentu wiersza poleceń.
  • -hdla sufiksów czytelnych dla człowieka, takich jak Mmegabajty i Ggigabajty (opcjonalnie).
  • /*po prostu rozwija się do wszystkich katalogów (i plików) w /.

    Uwaga: pliki dotf nie są uwzględniane; biegnij, shopt -s dotglobaby uwzględnić również te.

Przydatne jest również sortowanie według rozmiaru:

du -sh /* | sort -h

Tutaj:

  • -hzapewnia sortpoprawną interpretację sufiksów czytelnych dla człowieka.
Tomasz
źródło
8
Jeśli masz katalogi kropkowe w katalogu głównym, możesz użyć, shopt -s dotglobaby uwzględnić je w liczbie.
Philipp
8
Jest to bardzo przydatne, ponieważ jest proste i zamiast tego możesz umieścić żądaną ścieżkę /*, np. ./Dla bieżącego katalogu lub ./*dla każdego elementu w bieżącym katalogu.
psur
3
@psur lub możesz użyć, ./*/aby uzyskać tylko podfoldery, a nie wszystkie elementy
relascope 28.01.16
7
Posortowana wersja:du -sh /* | sort -h
Vu Anh
2
@ c1phr Jeśli sortnie masz -h, musisz to również pominąć du, w przeciwnym razie sortowanie będzie mieszało kilo / mega / gigabajty. du -s /* | sort -nr.
Thomas,
79

Często muszę znaleźć największe katalogi, więc aby uzyskać posortowaną listę zawierającą 20 największych katalogów, robię to:

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

W takim przypadku rozmiary będą zgłaszane w megabajtach.

Janne Pikkarainen
źródło
11
Oto sposób, aby uczynić go bardziej czytelnym du -sh / some / path | sort -hr | głowa -n 20
Xedecimal
6
@Xedecima problem z używaniem h polega na tym, że sort nie wie, jak obsługiwać różne rozmiary. Na przykład 268K jest posortowane powyżej 255M i oba są posortowane powyżej 2,7G
Chris
4
Argument -h (czytelny dla człowieka) w komendzie „sort” powinien poprawnie odczytać te wartości. Podobnie jak flaga du's-h eksportuje je. W zależności od tego, co prowadzisz, zgaduję.
Xedecimal
Działa w Ubuntu 16.04. Dobra wskazówka.
SDsolar
sudo du -haxt 1G / | sort -hr | głowa -30
zboczeniec
22

Lubię do tego używać Ncdu , możesz używać kursora do nawigacji i przeglądania struktury katalogów, którą działa naprawdę dobrze.

BuddhaLincoln
źródło
Niesamowite. Słowa kluczowe: du spełnia ncurses. Możesz użyć, baby upuścić do powłoki w katalogu.
Ciro Santilli 31 改造 中心 法轮功 六四 事件
11

Istniejące odpowiedzi są bardzo pomocne, być może niektórzy początkujący (tacy jak ja) również uznają to za pomocne.

  1. Bardzo prosta pętla, ale dla mnie był to dobry początek dla niektórych innych operacji związanych z rozmiarem:

    for each in $(ls) ; do du -hs "$each" ; done
    
  2. Bardzo podobny do pierwszej odpowiedzi i prawie taki sam wynik jak 1.), ale zajęło mi trochę czasu, aby zrozumieć różnicę * do ./*, jeśli w podkatalogu:

    du -sh ./*
    
Jaskółka oknówka
źródło
for eachnie działa, ponieważ dodaje znaki konsoli (np. \033[) do listy folderów
machineaddict
@machineaddict nie jestem pewien, co masz na myśli. Używam tego cały czas, działa mi dobrze.
Martin
spróbuj uruchomić polecenie, zaczynając od for each. to nie zadziała
machineaddict
uruchamiam polecenie dokładnie tak, jak tutaj napisano. zaczynając od dla każdego. Pracuje.
Martin
7

Następujące duwywołanie powinno działać w systemach BSD:

du -d 1 /
Philipp
źródło
1
Moje du(Ubuntu 10.4) nie ma -dopcji. W jakim systemie jesteś?
Thomas
W moim openSUSE nie ma też opcji -d :(
2ndkauboy
OK, to tylko opcja BSD (korzystam z OS X).
Philipp
Odpowiednia kombinacja opcji przenośnych w BSD / * NIX to du -sk /*. Tak bardzo nienawidzę tych -krzeczy. Linux „ -htotalnie kołysze”.
Dummy00001,
w innych systemach--max-depth
Wisznu Kumar
4

To nie jest łatwe. duKomenda albo pokazuje pliki i foldery (domyślne) lub tylko rozmiary wszystkich elementów, które można określić w wierszu poleceń (opcja -s).

Aby uzyskać największe elementy (pliki i foldery) posortowane według rozmiarów czytelnych dla ludzi w systemie Linux:

du -h | sort -h

To pochowa cię w tonie małych plików. Możesz się ich pozbyć za pomocą --threshold(1 MB w moim przykładzie):

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

Zaletą tego polecenia jest to, że zawiera ukryte foldery kropkowe (foldery zaczynające się od .).

Jeśli naprawdę chcesz tylko foldery, musisz użyć, findale może to być bardzo, bardzo wolne, ponieważ dubędziesz musiał skanować wiele folderów kilka razy:

find . -type d -print0 | sort -z | xargs --null -I '{}' du -sh '{}' | sort -h
Aaron Digulla
źródło
1
--threshold ^^^ ta opcja nie jest availavle na Linuksie
podarok
1
@podarok Jest dostępny w systemie Linux OpenSUSE 13.2. Spróbuj znaleźć nowszą wersję swojej dystrybucji lub sam skompiluj nowszą wersję pakietu.
Aaron Digulla,
Nie działa na Ubuntu LTS (14.04). Jest to najnowszy))
podarok
@podarok Która wersja GNU coreutils? Mój jest 8,24.
Aaron Digulla,
1
Buforowanie może być złym terminem. Myślałem o czymś takim, jak zrobione w tym porcie superuser.com/a/597173/121352, w którym raz skanujemy zawartość dysków do mapowania, a następnie nadal używamy danych z tego mapowania, zamiast ponownie uderzać w dysk.
Hennes,
1

Należy pamiętać, że nie można porównywać katalogów z duróżnymi systemami / maszynami bez upewnienia się, że oba mają taki sam rozmiar systemu plików. Może się to liczyć, jeśli zsynchronizujesz niektóre pliki z komputera z systemem Linux do systemu nas i chcesz samodzielnie zsynchronizować katalog. Możesz uzyskać różne wyniki z dupowodu różnych rozmiarów bloków ....

Jimmy Koerting
źródło
0

Możesz także sprawdzić xdiskusage . Podadzą ci te same informacje, ale przedstawione graficznie, a także pozwalają na drążenie w dół (bardzo przydatne). Istnieją inne podobne narzędzia dla KDE, a nawet Windows.

Śleske
źródło
0

Możesz użyć lsw połączeniu z awk:

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

Dane wyjściowe lssą przesyłane do awk. awkrozpoczyna przetwarzanie danych. Standardowym ogranicznikiem jest spacja. Zmienna totsumowa jest inicjowana na zero; następująca instrukcja jest wykonywana dla każdego wiersza / wiersza wyprowadzonego przez ls. Po prostu zwiększa się totwraz z rozmiarem. $5oznacza piątą kolumnę (wyprowadzoną przez ls). Na koniec dzielimy przez (1024 * 1024), aby zsumować w megabajtach.

Jeśli chcesz przekonwertować to na skrypt lub funkcję (.bashrc), możesz również użyć go do uzyskania rozmiaru niektórych podzbiorów katalogów, zgodnie z typami plików.

Jeśli potrzebujesz informacji o całym systemie, kdirstatmoże się przydać!

JM Stoorvogel
źródło
Zgadzam się, że można rozwinąć ten przykład i robić sztuczki, takie jak uzyskanie rozmiaru „określonych podzbiorów katalogów, zgodnie z typami plików” itp .; może wydawać się dobrym punktem wyjścia. Niemniej jednak to rozwiązanie jest wadliwe od samego początku. Każdemu użytkownikowi, który chciałby skorzystać z tej metody, polecam przeczytanie odpowiedzi i komentarzy do tego pytania oraz zamieszczonego tam linku . Nie twierdzę, że w ogóle nie możesz tego zrobić. Poznaj ograniczenia, to wszystko.
Kamil Maciorowski