Jak wyświetlić rozmiar każdego pliku i katalogu oraz posortować malejąco w Bash?

108

Stwierdziłem, że nie jest łatwo uzyskać sposób, w jaki rozmiar katalogu w Bash?

Chcę, aby kiedy piszę ls -<some options>, mógł wyświetlić wszystkie sumy rozmiaru pliku katalogu i plików w tym samym czasie i sortować według rozmiaru.

Czy to jest możliwe?

Kit Ho
źródło
2
Co dokładnie masz na myśli mówiąc o „rozmiarze” katalogu? Liczba plików znajdujących się pod nim (rekurencyjnie czy nie)? Suma rozmiarów plików znajdujących się pod nim (rekurencyjnie lub nie)? Rozmiar dysku samego katalogu? (Katalog jest zaimplementowany jako specjalny plik zawierający nazwy plików i inne informacje.)
Keith Thompson
powinno być sumą rozmiarów plików znajdujących się pod nim rekurencyjnie
Kit Ho
1
@Kit: Więc dujest odpowiedź.
Keith Thompson,
@KeithThompson @KitHo dupolecenie szacuje użycie przestrzeni plików, więc nie możesz go użyć, jeśli chcesz uzyskać dokładny rozmiar.
ztank1013
@ ztank1013: W zależności od tego, co rozumiesz przez „dokładny rozmiar” du(przynajmniej wersja GNU coreutils) prawdopodobnie ma opcję dostarczenia informacji.
Keith Thompson,

Odpowiedzi:

218

Po prostu przejdź do katalogu i uruchom następujące polecenie:

du -a --max-depth=1 | sort -n

LUB dodaj -h dla rozmiarów czytelnych dla człowieka i -r, aby najpierw wypisać większe katalogi / pliki.

du -a -h --max-depth=1 | sort -hr
Deweloper
źródło
23
du -hwymaga sort -hrównież, aby to zapewnić, powiedzmy, 981Mwcześniej 1.3G; z sort -ntylko numery byłyby brane pod uwagę, a oni być niewłaściwy sposób okrągłe.
Smylers
Nie wyświetla rozmiaru poszczególnych plików w bieżącym katalogu, tylko rozmiar jego podkatalogów i całkowity rozmiar bieżącego katalogu. W jaki sposób uwzględniasz również poszczególne pliki w wynikach (aby odpowiedzieć na pytanie OP)?
Erik Trautman,
@ErikTrautman, aby wyświetlić listę plików, musisz również dodać -ai używać --allzamiast --max-depth=1takdu -a -h --all | sort -h
Franco
Niesamowite! Od kilku lat robię coś lżejszego. :)
Colby Blair
6
sort -hdziała tylko na wersji GNU / Linuksie, nie ma szczęścia z BSD / OS X.
djule5
20

Najwyraźniej --max-depthopcji nie ma w wersji dupolecenia w systemie Mac OS X. Zamiast tego możesz użyć następujących.

du -h -d 1 | sort -n

cevaris
źródło
Najwyraźniej, ale nie jest to zaskakujące.
Josh Habdas
20
du -s -- * | sort -n

(to nie pokaże ukrytych plików (.dotfiles))

Użyj du -smdla jednostek Mb itp. Zawsze używam

du -smc -- * | sort -n

ponieważ suma line ( -c) znajdzie się na dole z oczywistych powodów :)

PS:

  • Zobacz komentarze dotyczące obsługi plików dotfiles
  • Często używam np. „Du -smc / home / / | sort -n | tail ', aby zorientować się, gdzie dokładnie znajdują się duże części
sehe
źródło
5
du --max-depth=1|sort -nlub find . -mindepth 1 -maxdepth 1|xargs du -s|sort -ndo dołączania plików dotfiles.
Arnaud Le Blanc
@arnoud: Używam że też, ale nie wydaje się prawo dodatek do tej kwestii (/ odpowiedź) :)
sehe
@ arnaud576875, find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 du -s | sort -njeśli niektóre ze znalezionych ścieżek mogą zawierać spacje.
Lri,
1
To świetny wariant, aby uzyskać czytelny dla człowieka widok największego:sudo du -smch * | sort -h | tail
marsbard.
16

Komenda

du -h --max-depth=0 * | sort -hr

Wynik

3,5M    asdf.6000.gz
3,4M    asdf.4000.gz
3,2M    asdf.2000.gz
2,5M    xyz.PT.gz
136K    xyz.6000.gz
116K    xyz.6000p.gz
88K test.4000.gz
76K test.4000p.gz
44K test.2000.gz
8,0K    desc.common.tcl
8,0K    wer.2000p.gz
8,0K    wer.2000.gz
4,0K    ttree.3

Wyjaśnienie

  • du wyświetla "użycie dysku"
  • h oznacza „czytelne dla człowieka” (zarówno w sortowaniu, jak i w du)
  • max-depth=0oznacza, duże nie pokaże rozmiarów podfolderów (usuń to, jeśli chcesz pokazać wszystkie rozmiary każdego pliku w każdym pod-, pod-, ..., folderze)
  • r jest dla "odwrócenia" (najpierw największy plik)

ncdu

Kiedy przyszedłem do tego pytania, chciałem wyczyścić mój system plików. Narzędzie wiersza poleceń ncdujest o wiele lepiej dostosowane do tego zadania.

Instalacja na Ubuntu:

$ sudo apt-get install ncdu

Stosowanie:

Wystarczy wpisać ncdu [path]w linii poleceń. Po kilku sekundach na analizę ścieżki zobaczysz coś takiego:

$ ncdu 1.11 ~ Use the arrow keys to navigate, press ? for help
--- / ---------------------------------------------------------
.  96,1 GiB [##########] /home
.  17,7 GiB [#         ] /usr
.   4,5 GiB [          ] /var
    1,1 GiB [          ] /lib
  732,1 MiB [          ] /opt
. 275,6 MiB [          ] /boot
  198,0 MiB [          ] /storage
. 153,5 MiB [          ] /run
.  16,6 MiB [          ] /etc
   13,5 MiB [          ] /bin
   11,3 MiB [          ] /sbin
.   8,8 MiB [          ] /tmp
.   2,2 MiB [          ] /dev
!  16,0 KiB [          ] /lost+found
    8,0 KiB [          ] /media
    8,0 KiB [          ] /snap
    4,0 KiB [          ] /lib64
e   4,0 KiB [          ] /srv
!   4,0 KiB [          ] /root
e   4,0 KiB [          ] /mnt
e   4,0 KiB [          ] /cdrom
.   0,0   B [          ] /proc
.   0,0   B [          ] /sys
@   0,0   B [          ]  initrd.img.old
@   0,0   B [          ]  initrd.img
@   0,0   B [          ]  vmlinuz.old
@   0,0   B [          ]  vmlinuz

Usuń aktualnie podświetlony element za pomocą d, zakończ za pomocą CTRL+c

Martin Thoma
źródło
Możesz także napisać du -hs * | sort -hr. -s (podsumowanie) jest takie samo jak --max-depth = 0
rasmusx
5

ls -Ssortuje według rozmiaru. Następnie, aby wyświetlić również rozmiar, ls -lSwyświetla długi ( -l), posortowany według rozmiaru ( -S). I zazwyczaj dodać -hteż, aby ułatwić czytać, tak ls -lhS.

Thanatos
źródło
1
Ach, przepraszam, to nie było jasne z twojego postu. Chcesz du, wygląda na to, że ktoś to opublikował. @sehe: Zależy od Twojej definicji rzeczywistego - pokazuje ilość miejsca, jaką katalog wykorzystuje do przechowywania. (Nie chodzi tylko o dodanie rozmiaru pozycji podrzędnych). Nie jest to liczba losowa i nie zawsze wynosi 4 KB.
Thanatos
1

Prosto i szybko:

find . -mindepth 1 -maxdepth 1 -type d | parallel du -s | sort -n

* wymaga GNU Parallel .

pje
źródło
0

Myślę, że mogłem się domyślić, co chcesz zrobić. To da posortowaną listę wszystkich plików i wszystkich katalogów, posortowaną według rozmiaru pliku i rozmiaru zawartości w katalogach.

(find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n
dvorak
źródło
Nieważne, przedstawił znacznie prostsze rozwiązanie. Codziennie uczę się czegoś nowego!
dvorak
Nie sądzę, aby użycie dubyło opcją, da ci tylko przybliżony wynik.
ztank1013
0

[wersja rozszerzona]
Będzie to znacznie szybsze i precyzyjniejsze niż początkowa wersja poniżej i zwróci sumę całego rozmiaru pliku w bieżącym katalogu:

echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc

stat -c %skomenda w pliku powróci jego rozmiar w bajtach. trKomenda tutaj służy do przezwyciężenia xargsograniczeń Command (widocznie rurociągów na xargsto wyniki przecinania na więcej wierszy, łamiąc logiki mojego polecenia). Dlatego trzadbano o zastąpienie wysuwu linii +znakiem (plus). sedma jedyny cel, aby usunąć ostatni +znak z otrzymanego ciągu, aby uniknąć narzekań ze strony końcowego bc(podstawowego kalkulatora) polecenia, które jak zwykle wykonuje obliczenia.

Wydajność: Przetestowałem to na kilku katalogach i ponad ~ 150.000 plików na górze (obecna liczba plików w moim pudełku Fedory 15), co moim zdaniem jest niesamowitym wynikiem:

# time echo `find / -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
12671767700

real    2m19.164s
user    0m2.039s
sys 0m14.850s

Na wypadek, gdybyś chciał dokonać porównania z du -sb /poleceniem, wyświetli szacunkowe użycie dysku w bajtach ( -bopcja)

# du -sb /
12684646920 /

Tak jak się spodziewałem, jest on nieco większy niż moje obliczenia polecenia, ponieważ dunarzędzie zwraca przydzielone miejsce dla każdego pliku, a nie rzeczywiste zajęte miejsce.

[wersja początkowa]
Nie możesz użyć dupolecenia, jeśli chcesz znać dokładny sumaryczny rozmiar folderu, ponieważ (zgodnie z cytatem ze strony podręcznika) duszacuje użycie przestrzeni plików. W związku z tym doprowadzi cię do złego wyniku, przybliżenia (być może zbliżonego do wielkości sumy, ale najprawdopodobniej większego niż rzeczywisty rozmiar, którego szukasz).

Myślę, że można odpowiedzieć na twoje pytanie na różne sposoby, ale to jest moje:

ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc

Znajduje wszystkie pliki w. katalog (zmień. na dowolny katalog), dołączane są również pliki ukryte i (używając xargs) wypisuje ich nazwy w jednej linii, a następnie tworzy szczegółową listę za pomocą ls -l. Ten (czasami) ogromny wynik jest przesyłany potokiem do polecenia cut, a tylko piąte pole ( -f5), które określa rozmiar pliku w bajtach, jest pobierane i ponownie przesyłane potokowo, xargsco ponownie tworzy pojedynczą linię rozmiarów oddzielonych spacjami. Teraz wykonaj magię sed, która zastępuje każdą spację znakiem plus ( +), a na końcu bc(podstawowy kalkulator) wykonuje obliczenia.

Może wymagać dodatkowego dostrojenia, a lspolecenie może narzekać na zbyt długą listę argumentów.

ztank1013
źródło
jeśli diretory jest zbyt duża, to rozłącza się przez dłuższy czas, należy spróbować pracy na swoim katalogu domowym: p
Kit Ho
@KitHo cóż, obawiam się, że nie ma łatwego i szybkiego sposobu na uzyskanie dokładnego wyniku bez przeszukiwania każdego pliku i dodawania jego rozmiaru, stąd lenistwo polecenia zależy głównie od tego, ile plików znajduje się pod przeszukiwanym katalogiem ... Ale wierzę, że tak to margines na ulepszenia ... niezłe wyzwanie!
ztank1013
@KitHo hej, spójrz na ulepszoną wersję w mojej odpowiedzi ... i oczywiście daj mi znać!
ztank1013
0

Kolejne proste rozwiązanie.

$ for entry in $(ls); do du -s "$entry"; done | sort -n

wynik będzie wyglądał

2900    tmp
6781    boot
8428    bin
24932   lib64
34436   sbin
90084   var
106676  etc
125216  lib
3313136 usr
4828700 opt

zmiana „du -s” na „du -sh” pokaże rozmiar czytelny dla człowieka, ale nie będziemy mogli sortować w tej metodzie.

Ambal
źródło
0

możesz użyć poniższego, aby wyświetlić listę plików według rozmiaru du -h | sort -hr | więcej lub du -h --max-depth = 0 * | sort -hr | więcej

Ghassan Shawahneh
źródło
0

Zwykle używam du w prosty sposób.

du -sh */ | sort -n

To daje mi wyobrażenie o tym, które katalogi zajmują najwięcej miejsca. Później mogę przeprowadzić dokładniejsze wyszukiwania.

Tempo
źródło
Ten rodzaj działa, ale ignoruje jednostki rozmiaru pliku podczas sortowania.
Benjamin Engwall,