Home » Questions » Computers [ Ask a new question ]

How do I get the size of a Linux or Mac OS X directory from the command-line? [duplicate]

How do I get the size of a Linux or Mac OS X directory from the command-line? [duplicate]

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

Asked by: Guest | Views: 364
Total answers/comments: 2
bert [Entry]

"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."
bert [Entry]

"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"