Created
September 28, 2011 05:56
-
-
Save bonyiii/1247094 to your computer and use it in GitHub Desktop.
How to find and delete all hard links to a file
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# http://linuxcommando.blogspot.com/2008/09/how-to-find-and-delete-all-hard-links.html | |
How to find and delete all hard links to a file | |
Deleting a file is deceptively simple. You can simply use the rm command like this. | |
$ rm file1 | |
However, if the file has one or more hard links to it, life gets more interesting. You need to seek and destroy all hard links to the file. | |
A hard link is essentially another name for a file. Hard links to file1 can be created as follows: | |
$ ln file1 file2 | |
$ ln file1 tmp/file3 | |
file2 and file3 become another name of file1. | |
How do I know if some file has a hard link to it? | |
Do a long listing of the file like this. | |
$ ls -l file1 | |
-rw-r--r-- 3 peter peter 0 2008-09-01 16:15 file1 | |
Note that the hard link count has the value 3 (this is the number to the left of the file owner). It means that the physical file has 3 names: file1 and two others. | |
If you only rm file1, the other 2 names still exist, and users can still access the physical file using these 2 names. | |
To find out all hard links to file1, use this command. | |
$ find /home -xdev -samefile file1 | |
/home/peter/file1 | |
/home/peter/tmp/file3 | |
/home/peter/file2 | |
Note that we specified /home as the search starting point. You should replace /home with the mount point for the filesystem in which your file1 was created. (This is likely to be either /home or / for files in your home directory.) | |
The reason for using the filesystem's mount point is that hard links are restricted to reside in the same filesystem as the physical file. This means that file2 and file3 must be in the same filesystem as file1. Therefore, to find ALL hard links to a file, you must start search at the mount point of the filesystem. | |
The -xdev option instructs find NOT to traverse directories in other filesystems. | |
To find and delete all hard links to a file: | |
$ find /home -xdev -samefile file1 | xargs rm | |
An alternative (and slightly more complicated) method is by using inodes. An inode is a data structure assigned to a physical file that contains all its meta-information except the file's name(s). | |
All hard links to a physical file share the same inode, and have the same inode id number. Therefore, if you know the inode number of a file, you can find all hard links to the file by searching for files with the same inode number. | |
To display a file's inode number, use ls -i: | |
$ ls -li file1 | |
2655341 -rw-r--r-- 3 peter peter 0 2008-09-02 19:09 file1 | |
The first column in the above listing shows the file's inode number. | |
Now that you know the inode number of file1, you can use the find command to search for all files that have the same inode number: | |
$ find /home -xdev -inum 2655341 | |
/home/peter/file1 | |
/home/peter/tmp/file3 | |
/home/peter/file2 | |
To delete all hard links to the physical file: | |
$ find /home -xdev -inum 2655341 | xargs rm |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
find /home -xdev -samefile file1 | xargs rm
throws a wobbly when the file path contains spaces.