To pytanie ma już odpowiedź tutaj:
Jakiego polecenia używam, aby znaleźć rozmiar wszystkich plików (rekurencyjnie) w katalogu Linux lub Mac OS X?
To pytanie ma już odpowiedź tutaj:
Jakiego polecenia używam, aby znaleźć rozmiar wszystkich plików (rekurencyjnie) w katalogu Linux lub Mac OS X?
Odpowiedzi:
Wersja BSD du
uż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 -h
wyniki 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ć find
i awk
podać 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 awk
służy do zliczania bajtów. -type f
Flaga 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 du
może podawać wartości w rzeczywistych bajtach zamiast bloków. Szkoda, że wersja BSD du
nie jest tak elastyczna.
du
z GNU coreutils z -b
opcją, otrzymuję inny wynik niż z twoją find
fajką. W przypadku katalogu o pojemności 36 GB różnica wynosi 82 KB.
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
du -sch
jeśli chcesz czegoś łatwiejszego do odczytania.
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
find . -type f -print0 | xargs -0 stat -c%s | awk '{b+=$1} END {print b}'
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 -h
dla sort
nie jest dostępna w OSX / BSD, więc musisz zainstalować sort
z 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
brew install coreutils
przeciwnym razie użyj polecenia BSD sort na końcu bez -h
.
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
-k
opcji użycia rozmiaru bloku 1K-bajt