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ąć?


--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.

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.


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


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 ./*
    

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 /

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

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 ....


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.


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ć!


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.