# Linux – How to get the actual directory size (out of du)

dugnuinodelinuxunix

How do I get the actual directory size, using UNIX/Linux standard tools?

Alternative question: How do I get du to show me the actual directory size (not disk usage)?

Since people seem to have different definitions of the term "size": My definition of "directory size" is the sum of all regular files within that directory.

I do NOT care about the size of the directory inode or whatever (blocks * block size) the files take up on the respective file system. A directory with 3 files, 1 byte each, has a directory size of 3 bytes (by my definition).

Calculating the directory size using du seems to be unreliable.
For example, mkdir foo && du -b foo reports "4096 foo", 4096 bytes instead of 0 bytes. With very large directories, the directory size reported by du -hs can be off by 100 GB (!) and more (compressed file system).

So what (tool/option) has to be used to get the actual directory size?

Here is a script displaying a human readable directory size using Unix standard tools (POSIX).

#!/bin/sh
find ${1:-.} -type f -exec ls -lnq {} \+ | awk ' BEGIN {sum=0} # initialization for clarity and safety function pp() { u="+Ki+Mi+Gi+Ti+Pi+Ei"; split(u,unit,"+"); v=sum; for(i=1;i<7;i++) { if(v<1024) break; v/=1024; } printf("%.3f %sB\n", v, unit[i]); } {sum+=$5}
END{pp()}'


eg:

\$ ds ~
72.891 GiB