2009-08-13 20:00:15 +0000 2009-08-13 20:00:15 +0000
76
76

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?

Odpowiedzi (5)

83
83
83
2012-03-18 05:54:47 +0000

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.

75
75
75
2009-08-13 20:01:52 +0000

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

9
9
9
2013-11-11 22:31:48 +0000

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
6
6
6
2015-03-05 14:03:07 +0000

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
```.
2
2
2
2014-03-05 11:30:06 +0000

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