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

Hoe krijg ik de grootte van een Linux of Mac OS X directory op de command-line?

Welk commando gebruik ik om de grootte van alle bestanden (recursief) in een Linux of Mac OS X directory te vinden?

Antwoorden (5)

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

De BSD-versie van du die in OS X wordt gebruikt, rapporteert de grootte in blokken van 512 bytes – de grootte wordt in wezen naar boven afgerond tot de volgende waarde van 512 bytes. Dit vertelt je de ruimte op schijf, die groter is dan de hoeveelheid gegevens. Als je veel kleine bestanden hebt, kan het verschil groot zijn.

Hier is een voorbeeld.

Dit is de waarde met gewone du. Het is in blokken van 512 bytes:

$ du -s
248 .

De -h vlag resulteert in een leesbaarder getal, in kilobytes. Zoals verwacht, is het de helft van het aantal blokken van 512 bytes:

$ du -hs
124K .

Tenslotte kunt u find en awk gebruiken om u de som van de werkelijke bytes in de bestanden te geven. Dit is een beetje traag, maar het werkt:

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

Deze waarde komt precies overeen met het getal dat door Finder’s Get Info venster wordt gerapporteerd. (Er zijn geen vreemde vorken of xattrs in deze set bestanden.) Het is aanzienlijk kleiner dan de waarde die wordt gerapporteerd door du.

Zo werkt het: het krijgt een lijst van alle bestanden, en geeft die door aan ls -l; dan wordt awk gebruikt om de bytes te tellen. De -type f vlag is er zodat alleen bestanden (en niet directories) naar ls worden gestuurd. Zonder die vlag worden ook directorynamen naar ls gestuurd, en wordt elk bestand twee keer opgesomd: één keer als individueel bestand, en één keer als item in de directory.

De GNU versie van du kan waarden geven in echte bytes in plaats van blokken. Het is jammer dat de BSD versie van du niet zo flexibel is.

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

Toon de grootte van een enkel bestand

du -h path_to_a_file

Toon de grootte van de inhoud van een directory, elke sub-directory, en elk individueel bestand:

du -h path_to_a_directory

Toon de grootte van de inhoud van een directory:

du -sh path_to_a_directory

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

du - vertelt het schijfgebruik niet de bestandsgrootte.

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

bovenstaande terminal code (im op osx 10.6) biedt voor mij het beste resultaat en is veel sneller dan “find … -exec”

een snelle 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

Je kunt du -ah . gebruiken, dat geeft de grootte van alle bestanden en mappen recursief weer.

Dit kan gecombineerd worden met sort, zodat je de top-20 grootste mappen in de huidige map te zien krijgt:

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

Opmerking: Optie -h voor sort is niet beschikbaar op OSX/BSD, dus je moet sort installeren vanuit coreutils (bv. via brew) en het bin-pad toepassen op PATH, bv.

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

Anders gebruik je:

du -a . | sort -rn | head -20
2
2
2
2014-03-05 11:30:06 +0000

Ik combineerde al jullie approuches en combineerde het met een menselijk leesbare output het resultaat is:

#!/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 naar de gist: https://gist.github.com/mlegenhausen/9365461

Gerelateerde vragen

6
10
12
7
10