Ever considered the hard link count from ls on directories?
vidar@kelvin ~/src $ ls -l total 108 drwxr-xr-x 4 vidar vidar 4096 2009-11-22 12:52 aml-lsb drwxr-xr-x 13 vidar vidar 4096 2009-12-13 16:00 delta3d_REL-2.4.0 drwxr-xr-x 23 vidar vidar 4096 2010-02-02 18:22 linux-2.6.32.7 ...
For files, this is the number of hard links. You can use find / -samefile filename
to find all files that point to the same file inode.
So what does this number mean for directories? Exactly the same thing.
Users, including root, are blocked from creating directory hard links out of the kernel’s mortal fear of cyclical directory trees (or should I say directory graphs?). The kernel still creates them though, specifically in the form of the “.” entry in the directory itself, and “..” in each subdirectory.
An empty directory /foo/bar
will have two links, /foo/bar
itself, and /foo/bar/.
. When creating a subdirectory /foo/bar/baz
, you will get the additional hard link /foo/bar/baz/..
. In other words, the hard link count is the number of subdirectories plus two.
Here’s a party trick for listing directory hard links in bash:
vidar@kelvin ~/src $ ls -ld aml-lsb/{,.,*/..} drwxr-xr-x 4 vidar vidar 4096 2009-11-22 12:52 aml-lsb/ drwxr-xr-x 4 vidar vidar 4096 2009-11-22 12:52 aml-lsb/. drwxr-xr-x 4 vidar vidar 4096 2009-11-22 12:52 aml-lsb/bin/.. drwxr-xr-x 4 vidar vidar 4096 2009-11-22 12:52 aml-lsb/lib/.. vidar@kelvin ~/src $
Clearly, each of them refers to the same thing, and the numbers add up (if they don’t, shopt -s dotglob
)
As a side note, you can use mount --rbind
to fake a directory hard link. This will remount a directory and all submounts on some other directory, but will prevent cycles.
You can also use mount --bind
to remount without submounts. This can be useful for when you want to copy the contents of a directory that has another file system mounted over it. This is most commonly /dev, which is over-mounted with udev early in the boot process. Many people don’t realize that they have an entire /dev they’ve never seen!