1. Overview

We may wish to see how big our directories are. This can be made more difficult if those directories contain links to other files in the file system. For example, we might have a single folder that has links to all the important files for backup purposes.

If used correctly, the du command can help us find out how much space is used by our files.

In this tutorial, we’ll see how to use the du command when working with folders that have hard links.

2. The du Command

The du command shows us how much disk space our files take up.

2.1. Using du to Summarize

We can summarize the contents of a directory by using the -s switch of du.

Let’s look at an example where we have some files:

$ ls
actual_files
$ ls actual_files/
a_large_file  another_large_file

Here, we have a folder named actual_files that has two files. Let’s use du to calculate the size of the actual_files directory:

$ du -sh *
155M    actual_files

Here, we’ve used the -h switch as well as the -s to show us the sizes in human-readable values.

Now, let’s create links to our files in a separate directory:

$ mkdir to_backup
$ ln actual_files/a_large_file to_backup/link_to_a_large_file
$ ln actual_files/another_large_file to_backup/link_to_another_large_file
$ ls to_backup/
link_to_a_large_file  link_to_another_large_file 

So, we’ve created a new folder and created links to files in the folder named actual_files. Let’s see how du handles it:

$ du -sh *
155M    actual_files
4.0K    to_backup

Isn’t that surprising? The original folder is over 150 MB, but the folder with the links is just 4 KB, even though it links to the same files.

However, if we try to compute the size of just the folder with the hard links, it produces the desired result:

$ du -sh to_backup/
155M    to_backup/
$ du -sh actual_files/
155M    actual_files/

The reason why it behaves differently is a little involved, and we’ll look at it later. Let’s first look at how to make the du command produce the output we want.

When working with links, the du command has several useful flags. Of specific interest to us here are the -L and the -l flags. The first of these is for symbolic links. Let’s use the second, which helps us with hard links:

$ du -slh *
155M    actual_files
155M    to_backup

As we can see, we now have the exact result we’re looking for.

To understand why the du command behaves the way it does, let’s look at some Linux internals.

In Linux, a file is internally represented by an Inode. An Inode holds the file’s metadata. It’s represented by a unique number. When we create a hard link to a file, we are just creating another reference to the same Inode.

Once a hard link is created, there’s no difference between the hard link and the original file.

4.2. Inodes and the du Command

In the examples above, when we tried to calculate the total size of the folder without the -l flag, the du command knew that it was operating on the same Inode. So, it calculated the size just once, even though there were two references to that Inode.

When using the -l flag, we explicitly ask it to report the actual size, even for hard links. So, when it encounters a hard link to a file, it calculates the size of both the link and the file.

5. Summary

In this article, we saw how to use the du command when working with files and hard links.

We also looked at the underlying Inode implementation to understand why the command behaves the way it does.