What is the difference between du -h and ls -lh?

I am having a difficult time grasping what is the correct way to read the size of the files since each command gives you varying results. I also came across a post at http://forums.devshed.com/linux-help-33/du-and-ls-generating-inconsistent-file-sizes-42169.html which states the following;

du gives you the size of the file as it resides on the file system. ( IE will will always give you a result that is divisible by 1024 ).

ls will give you the actual size of the file.

What you are looking at is the difference between the actual size of the file and the amount of space on disk it takes. ( also called file system efficiency ).

What is the difference between as it resides on the file system and actual size of the fil


This is called slack space:

Each layer of abstraction on top of individual bits and bytes results in wasted space when a datafile is smaller than the smallest data unit the file system is capable of tracking. This wasted space within a sector, cluster, or block is commonly referred to as slack space, and it cannot normally be used for storage of additional data. For individual 256-byte sectors, the maximum wasted space is 255 bytes. For 64 kilobyte clusters, the maximum wasted space is 65,535 bytes.

So, if your filesystem allocates space in units of 64 KB, and you store a 3 KB file, then:

  • the file's actual size is 3 KB.
  • the file's resident size is 64 KB, as the remaining 61 KB in that unit can't be allocated to another file and is thus lost.

Note: Some filesystems support block suballocation, which helps to mitigate this issue by assigning multiple small files (or the tail ends of large files) into the same block.


There's another option here, that hasn't been covered -- sparse files. In this case, du will show a smaller size than a simple ls -l would, because ls is reporting the "size" of the file as being the apparent size (the number of bytes you could read, if you wanted a whole lot of zeroes), while du will continue to use the actual number of disk blocks in use.

Fun trick: Create a great many large sparse files, then impress your friends with how much disk space you have ("look, I'm storing eleventy-gazillion 1TB files on my hard drive!"). OK, maybe not so fun then.


Filesystems are made up of blocks. Files don't have to neatly fit into blocks. If a file was 1024 bytes it's size in ls and du would be 1024. If the file size was 1025 the size would be 1025 in ls and 2048 in du.

Note the example above assumes a block size of 1024. Larger block sizes are the norm these days e,g,

ls -l fred
-rw-r--r-- 1 iain users 1024 Jul 13 22:06 fred

du -h fred
8.0K    fred