91

What command do I use to find the size of all the files (recursively) in a Linux or Mac OS X directory?

3
  • 2
    you can use -k option to use block size of 1K-byte
    – Zoker
    Commented Dec 29, 2016 at 10:37
  • I just want to recommend this free software called Disk Inventory X. download it here derlien.com it's simple to use for mac osx
    – adam
    Commented Jan 6, 2018 at 23:05
  • Instead of du, I use ncdu, you can find the reference here, remysharp.com/2018/08/23/cli-improved
    – Alan Dong
    Commented Sep 19, 2018 at 23:28

5 Answers 5

100

The BSD version of du used in OS X reports size with 512-byte blocks -- the sizes are essentially rounded up to the next 512-byte value. This tells you the space on disk, which is larger than the amount of data. If you have a lot of small files, the difference can be large.

Here's an example.

This is the value with regular du. It's in 512-byte blocks:

$ du -s
248   .

The -h flag results in a more readable number, in kilobytes. As expected, it's half the number of 512-byte blocks:

$ du -hs
124K  .

Finally, you can use find and awk to give you the sum of actual bytes in the files. This is kind of slow, but it works:

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

This value matches exactly the number reported by Finder's Get Info window. (There are no weird forks or xattrs in this set of files.) It's significantly smaller than the value reported by du.

Here's how it works: it gets a list of all the files, and passes them to ls -l; then awk is used to count up the bytes. The -type f flag is there so that only files (and not directories) get sent to ls. Without that flag, it'll also send directory names to ls, and each file will be listed twice : once as an individual file, and once as an item in the directory.

The GNU version of du can give values in actual bytes instead of blocks. It's unfortunate that the BSD version of du is not as flexible.

2
  • Great explanation. Interestingly when using du from GNU coreutils with the -b option I get a different result than with your find pipe. For a 36 GB directory I get a 82 KB difference. Commented Jul 25, 2012 at 22:15
  • is there any way to print this out in a more human readable format? Commented Apr 26, 2017 at 21:42
80

Show the size of a single file

du -h path_to_a_file

Show the size of the contents of a directory, each sub-directory, and each individual file:

du -h path_to_a_directory

Show the size of the contents of a directory:

du -sh path_to_a_directory

5
  • 27
    du -sch if you want something more easily readable.
    – Joey
    Commented Aug 13, 2009 at 20:09
  • @Johannes, I guess you should post this comment as an answer, so it can be accepted?
    – Arjan
    Commented Aug 15, 2009 at 17:15
  • I find the -c option redundant (at least on Mac OS X) and du -sh supresses the subtotals. Commented Aug 17, 2009 at 18:35
  • Aha, I didn't know one could accept one's own answer. Now at least people know the question is solved.
    – Arjan
    Commented Aug 18, 2009 at 9:41
  • I'll happily accept a new answer that is an improvement on mine. Commented Aug 18, 2009 at 16:10
13

You can use du -ah . which displays sizes of all files and directories recursively.

This can be combined with sort, so you'll see the top-20 biggest directories in the current folder:

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

Note: Option -h for sort is not available on OSX/BSD, so you've to install sort from coreutils (e.g. via brew) and apply the bin path to PATH, e.g.

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

Otherwise use:

du -a . | sort -rn | head -20
2
  • First command not work on my macOS 10.12.1 #du -ah . | sort -rh | head -20 sort: invalid option -- h Try `sort --help' for more information.
    – nucleartux
    Commented Nov 24, 2016 at 15:11
  • 3
    @nucleartux Check the note below the command. This works in GNU sort which you can install on macOS via: brew install coreutils, otherwise use the BSD sort command at the end without -h.
    – kenorb
    Commented Nov 24, 2016 at 15:44
11

du - tells the disk use not the file size.

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

above terminal code (im on osx 10.6) offers for me the best result and is waaay faster than "find ... -exec"

a quick 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
3
  • 1
    If you want to do the same on Ubuntu: find . -type f -print0 | xargs -0 stat -c%s | awk '{b+=$1} END {print b}' Commented May 4, 2015 at 12:51
  • is there a way to get this result in a human-readable format? Commented Apr 26, 2017 at 21:46
  • I use rsync because it reports the same as Finder and is very fast: rsync -avzh -n --stats "/path/to/directory" | grep 'total size is' | awk '{ print $4 }' Commented Nov 18, 2023 at 3:41
2

I combined all your approuches and combined it with a human readable output the result 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 to the gist: https://gist.github.com/mlegenhausen/9365461

1
  • This doesn't work on macOS. The output is find: illegal option -- t
    – eAbi
    Commented Apr 3, 2020 at 9:28

Not the answer you're looking for? Browse other questions tagged .