Jak uzyskać rozmiar katalogu Linux lub Mac OS X z wiersza poleceń? [duplikować]

74

Jakiego polecenia używam, aby znaleźć rozmiar wszystkich plików (rekurencyjnie) w katalogu Linux lub Mac OS X?

Daryl Spitzer
źródło
2
możesz użyć -kopcji użycia rozmiaru bloku 1K-bajt
Zoker
Chcę tylko polecić to bezpłatne oprogramowanie o nazwie Disk Inventory X. pobierz go tutaj derlien.com , jest prosty w użyciu dla Mac OSX
Nimitack
Zamiast du, używam ncdu, można znaleźć odniesienie tutaj, remysharp.com/2018/08/23/cli-improved
Alan Dong

Odpowiedzi:

82

Wersja BSD duużywana w OS X podaje rozmiar bloków 512-bajtowych - rozmiary są zasadniczo zaokrąglane w górę do następnej wartości 512-bajtowej. Mówi ci to miejsce na dysku, które jest większe niż ilość danych. Jeśli masz dużo małych plików, różnica może być duża.

Oto przykład.

Jest to wartość regularna du. Jest w 512-bajtowych blokach:

$ du -s
248   .

Te -hwyniki flag w wielu bardziej czytelne, w kilobajtach. Zgodnie z oczekiwaniami jest to połowa liczby 512-bajtowych bloków:

$ du -hs
124K  .

Na koniec możesz użyć findi awkpodać sumę rzeczywistych bajtów w plikach. Jest to trochę powolne, ale działa:

$ find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
60527

Ta wartość odpowiada dokładnie liczbie podanej w oknie Get Info Get Info. (W tym zestawie plików nie ma dziwnych widelców ani xattrów.) Jest znacznie mniejszy niż wartość zgłaszana przez du.

Oto jak to działa: pobiera listę wszystkich plików i przekazuje je do ls -l; następnie awksłuży do zliczania bajtów. -type fFlaga jest tak, że tylko pliki (a nie katalogi) wysyłane do ls. Bez tej flagi wyśle ​​również nazwy katalogów ls, a każdy plik będzie wymieniony dwukrotnie: raz jako pojedynczy plik i raz jako element w katalogu.

Wersja GNU dumoże podawać wartości w rzeczywistych bajtach zamiast bloków. Szkoda, że ​​wersja BSD dunie jest tak elastyczna.

wch
źródło
Świetne wyjaśnienie. Co ciekawe, gdy używam duz GNU coreutils z -bopcją, otrzymuję inny wynik niż z twoją findfajką. W przypadku katalogu o pojemności 36 GB różnica wynosi 82 ​​KB.
Stefan Schmidt
czy jest jakiś sposób na wydrukowanie tego w bardziej czytelnym dla człowieka formacie?
anon58192932
75

Pokaż rozmiar pojedynczego pliku

du -h path_to_a_file

Pokaż rozmiar zawartości katalogu, każdego podkatalogu i każdego pojedynczego pliku:

du -h path_to_a_directory

Pokaż rozmiar zawartości katalogu:

du -sh path_to_a_directory

Daryl Spitzer
źródło
25
du -schjeśli chcesz czegoś łatwiejszego do odczytania.
Joey,
@Johannes, myślę, że powinieneś opublikować ten komentarz jako odpowiedź, aby można go było zaakceptować?
Arjan
Uważam, że opcja -c jest zbędna (przynajmniej w systemie Mac OS X), a du -sh pomija sumy pośrednie.
Daryl Spitzer,
Aha, nie wiedziałem, że można zaakceptować własną odpowiedź. Teraz przynajmniej ludzie wiedzą, że pytanie zostało rozwiązane.
Arjan,
Z radością zaakceptuję nową odpowiedź, która jest ulepszeniem mojej.
Daryl Spitzer,
9

du - informuje, że dysk nie używa rozmiaru pliku .

find . -type f -print0 | xargs -0 stat -f%z | awk '{b+=$1} END {print b}'

powyższy kod terminala (im na OSX 10.6) oferuje mi najlepszy wynik i jest o wiele szybszy niż „find ... -exec”

szybki punkt odniesienia

time find . -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}'
4744010970

real    0m0.086s
user    0m0.029s
sys 0m0.073s

time find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
4744010970

real    0m18.515s
user    0m2.929s
sys 0m9.339s
Kwas
źródło
Jeśli chcesz zrobić to samo na Ubuntu:find . -type f -print0 | xargs -0 stat -c%s | awk '{b+=$1} END {print b}'
Rodrigo Polo
czy istnieje sposób na uzyskanie tego wyniku w formacie czytelnym dla człowieka?
anon58192932
5

Możesz użyć, du -ah .który rekurencyjnie wyświetla rozmiary wszystkich plików i katalogów.

Można to połączyć sort, dzięki czemu zobaczysz 20 największych katalogów w bieżącym folderze:

du -ah . | sort -rh | head -20

Uwaga: Opcja -hdla sortnie jest dostępna w OSX / BSD, więc musisz zainstalować sortz coreutils(np. Przez brew) i zastosować ścieżkę bin PATH, np.

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.

W przeciwnym razie użyj:

du -a . | sort -rn | head -20
kenorb
źródło
Pierwsze polecenie nie działa na moim systemie macOS 10.12.1 #du -ah. | sort -rh | head -20 sort: niepoprawna opcja - h Spróbuj `sort --help ', aby uzyskać więcej informacji.
nucleartux
2
@nucleartux Sprawdź uwagę pod poleceniem. Działa to w sortowaniu GNU, które można zainstalować na macOS za pomocą:, w brew install coreutilsprzeciwnym razie użyj polecenia BSD sort na końcu bez -h.
kenorb
2

Połączyłem wszystkie twoje podejścia i połączyłem je z czytelnym dla człowieka wynikiem, w wyniku czego:

#!/bin/sh
find $1 -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}' | awk '{ sum=$1 ; hum[1024**3]="Gb";hum[1024**2]="Mb";hum[1024]="Kb"; for (x=1024**3; x>=1024; x/=1024){ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x];break } }}'

Link do treści: https://gist.github.com/mlegenhausen/9365461

malta
źródło