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?
Welk commando gebruik ik om de grootte van alle bestanden (recursief) in een Linux of Mac OS X directory te vinden?
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.
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
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
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
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