Jak uzyskać rozmiar katalogu w systemie Linux lub Mac OS X z wiersza poleceń?
Jakiego polecenia użyć, aby znaleźć rozmiar wszystkich plików (rekursywnie) w katalogu w systemie Linux lub Mac OS X?
Jakiego polecenia użyć, aby znaleźć rozmiar wszystkich plików (rekursywnie) w katalogu w systemie Linux lub Mac OS X?
BSD-owska wersja du
używana w systemie OS X zgłasza rozmiar za pomocą 512-bajtowych bloków – rozmiary są zasadniczo zaokrąglane w górę do następnej wartości 512-bajtowej. To mówi o przestrzeni na dysku, która jest większa niż ilość danych. Jeśli masz dużo małych plików, różnica może być duża.
Oto przykład.
To jest wartość z regularnym du
. Jest ona w 512-bajtowych blokach:
$ du -s
248 .
Flaga -h
powoduje, że otrzymujemy bardziej czytelną liczbę, w kilobajtach. Jak można się było spodziewać, jest to połowa liczby bloków 512-bajtowych:
$ du -hs
124K .
Wreszcie, można użyć find
i awk
, aby uzyskać 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ść pasuje dokładnie do liczby raportowanej przez okno Get Info Findera. (W tym zestawie plików nie ma żadnych dziwnych rozwidleń ani xattrs.) Jest ona znacznie mniejsza niż wartość podawana przez du
.
Oto jak to działa: pobiera listę wszystkich plików i przekazuje je do ls -l
; następnie awk
jest używane do zliczania bajtów. Flaga -type f
jest tam po to, by tylko pliki (a nie katalogi) były wysyłane do ls
. Bez tej flagi, na ls
będą wysyłane również nazwy katalogów, a każdy plik będzie wylistowany dwukrotnie: raz jako pojedynczy plik, a raz jako element w katalogu.
GNU wersja du
może podawać wartości w rzeczywistych bajtach, a nie blokach. Szkoda, że BSD-owska wersja du
nie jest tak elastyczna.
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 - mówi o użyciu dysku a nie o rozmiarze 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 dla mnie najlepszy rezultat i jest o wiele szybszy niż “find … -exec”
szybki benchmark
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
Możesz użyć du -ah .
, który wyświetla rozmiary wszystkich plików i katalogów rekursywnie.
To może być połączone z sort
, więc 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 na OSX/BSD, więc musisz zainstalować sort
z coreutils
(np. przez brew
) i zastosować ścieżkę bin do 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
```.
Połączyłem wszystkie twoje podejścia i połączyłem je z wyjściem czytelnym dla człowieka wynik jest:
#!/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 gist: https://gist.github.com/mlegenhausen/9365461