Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

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

share|improve this question

4 Answers 4

up vote 33 down vote accepted

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.

share|improve this answer
    
That is one damn good explanation. –  SpacemanSpiff Jul 13 '11 at 20:44
    
@Handyman5 - Thanks Handyman5. So when I am looking at the size of a file or folder using ls it returns the actual size whilst du returns the resident size? Is that correct? So when looking at the size of the file, which is the most accurate i.e. resident size or file size or is that an arbitrary question? –  PeanutsMonkey Jul 13 '11 at 21:19
4  
@PeanutsMonkey, accuracy is in the eye of the beholder. ;-) Basically, if you're concerned about how much space the file would take up somewhere else (like copying over the network, adding to a zip file, backup to an external drive, etc.), then the actual size is what you care about. If you're concerned with the amount of space left on the drive where the file lives now, then you care about the resident size. Since du is showing you the disk usage, it's looking at the space taken up on the current drive, and thus it shows you the resident size. –  Handyman5 Jul 13 '11 at 22:23
    
@Handyman5 - Thanks Handyman5. That was very helpful. –  PeanutsMonkey Jul 13 '11 at 22:30
    
@Handyman5 - It's almost a year after the post but am curious how the answer above differs when using df -h? –  PeanutsMonkey Jul 10 '12 at 19:30

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.

share|improve this answer
    
Let's confuse PeanutsMonkey even more: -s argument to ls returns file size in blocks, just like du. For example ls -las. –  Janne Pikkarainen Jul 14 '11 at 7:43

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
share|improve this answer

There's still one more reason they may be different. du -h knows when it sees the same file under another name (hard links, as opposed to symlinks) and will report each file for the size it is, but only add the size once to the common parent directory.

share|improve this answer
    
Thanks. Could you further elaborate on what you mean? –  PeanutsMonkey Jul 14 '11 at 19:58

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.