< Day Day Up > 

A link is a pointer to a file. Each time you create a file using vim, touch, cp, or any other means, you are putting a pointer in a directory. This pointer associates a filename with a place on the disk. When you specify a filename in a command, you are indirectly pointing to the place on the disk that holds the information you want.

Sharing files can be useful when two or more people are working on the same project and need to share information. You can make it easy for other users to access one of your files by creating additional links to the file.

To share a file with another user, first give the user permission to read from and write to the file. (You may also have to change the access permission of the parent directory of the file to give the user read, write, and/or execute permission.) Once the permissions are set appropriately, the user can create a link to the file so that each of you can access the file from your separate file trees.

A link can also be useful to a single user with a large file tree. You can create links to cross-classify files in your file tree, using different classifications for different tasks. For example, if your file tree is the one depicted in Figure 4-2, you might have a file named to_do in each subdirectory of the correspond directory that is, in personal, memos, and business. If you later find it difficult to keep track of everything you need to do, you can create a separate directory named to_do in the correspond directory and link each subdirectory's to-do list into that directory. For example, you could link the file named to_do in the memos directory to a file named memos in the to_do directory. This set of links is shown in Figure 4-13.

Figure 4-13. Using links to cross-classify files

Although it may sound complicated, this technique keeps all your to-do lists conveniently in one place. The appropriate list is easily accessible in the task-related directory when you are busy composing letters, writing memos, or handling personal business.

tip: About the discussion of hard links

Two kinds of links exist: hard links and symbolic (soft) links. Hard links are older and becoming dated. The section on hard links is marked as optional; you can skip it, although it discusses inodes and gives you insight into how the filesystem is structured.

optional: Hard Links

A hard link to a file appears as another file in the file structure. If the link appears in the same directory as the linked-to file, the links must have different filenames because two files in the same directory cannot have the same name.


The ln (link) utility (without the s or symbolic option) creates an additional hard link to an existing file using the following syntax:

 ln existing-file new-link 

The next command makes the link shown in Figure 4-14 by creating a new link named /home/alex/letter to an existing file named draft in Jenny's home directory:

 $ pwd /home/jenny $ ln draft /home/alex/letter 

Figure 4-14. Two links to the same file: /home/alex/letter and /home/jenny/draft

The new link appears in the /home/alex directory with the filename letter. In practice Alex may need to change directory and file permissions as shown in the previous section for Jenny to be able to access the file.

The ln utility creates an additional pointer to an existing file but does not make another copy of the file. Because there is only one file, the file status information such as access permissions, owner, and the time the file was last modified is the same for all links. Only the filenames differ. When Jenny modifies /home/jenny/draft, Alex sees the changes in /home/alex/letter.

cp VERSUS ln

The following commands verify that ln does not make an additional copy of a file. Create a file, use ln to make an additional link to the file, change the contents of the file through one link, and verify the change through the other link:

 $ cat file_a This is file A. $ ln file_a file_b $ cat file_b This is file A. $ vim file_b ... $ cat file_b This is file B after the change. $ cat file_a This is file B after the change. 

If you try the same experiment using cp instead of ln and change a copy of the file, the difference between the two utilities will become clearer. Once you change a copy of a file, the two files are different:

 $ cat file_c This is file C. $ cp file_c file_d $ cat file_d This is file C. $ vim file_d ... $ cat file_d This is file D after the change. $ cat file_c This is file C. 

ls and link counts

You can use ls with the l option, followed by the names of the files you want to compare, to see that the status information is the same for two links to the same file and is different for files that are not linked. In the following example, the 2 in the links field (just to the left of alex) shows there are two links to file_a and file_b:

 $ ls -l file_a file_b file_c file_d -rw-r--r-- 2 alex pubs 33  May 24 10:52 file_a -rw-r--r-- 2 alex pubs 33  May 24 10:52 file_b -rw-r--r-- 1 alex pubs 16  May 24 10:55 file_c -rw-r--r-- 1 alex pubs 33  May 24 10:57 file_d 

Although it is easy to guess which files are linked to one another in this example, ls does not explicitly tell you.

ls and inodes

Use ls with the i option to determine definitively which files are linked. The i option lists the inode (page 880) number for each file. An inode is the control structure for a file. If two filenames have the same inode number, they share the same control structure and are links to the same file. Conversely, when two filenames have different inode numbers, they are different files. The following example shows that file_a and file_b have the same inode number and that file_c and file_d have different inode numbers:

 $ ls -i file_a file_b file_c file_d 3534 file_a    3534 file_b    5800 file_c    7328 file_d 

All links to a file are of equal value: The operating system cannot distinguish the order in which multiple links were created. When a file has two links, you can remove either one and still access the file through the remaining link. You can remove the link used to create the file and, as long as one link remains, still access the file through that link.


In addition to hard links, Linux supports links called symbolic links, soft links, or symlinks. A hard link is a pointer to a file (the directory entry points to the inode), whereas a symbolic link is an indirect pointer to a file (the directory entry contains the pathname of the pointed-to file a pointer to the hard link to the file).

Limitations of hard links

Symbolic links were developed because of the limitations inherent in hard links. You cannot create a hard link to a directory, but you can create a symbolic link to a directory. A symbolic link can point to any file, regardless of where it is located in the file structure, but a hard link to a file must be in the same filesystem as the other hard link(s) to the file.

Often the Linux file hierarchy is composed of several filesystems. Because each filesystem keeps separate control information (that is, separate inode tables) for the files it contains, it is not possible to create hard links between files in different filesystems. When you create links only among files in your own directories, you will not notice these limitations.

One of the big advantages of a symbolic link is that it can point to a nonexistent file. This ability is useful if you need a link to a file that is periodically removed and re-created. A hard link keeps pointing to a "removed" file, which the hard link keeps alive even after a new file is created. A symbolic link always points to the newly created file and does not interfere with deleting the old file. For example, a symbolic link could point to a file that gets checked in and out under a source code control system, a .o file that is re-created by the C compiler each time you run make, or a log file that is periodically archived.

Although they are more general than hard links, symbolic links have some disadvantages. Whereas all hard links to a file have equal status, symbolic links do not have the same status as hard links. When a file has multiple hard links, it is analogous to a person having multiple full legal names, as many married women do. In contrast, symbolic links are analogous to nicknames. Anyone can have one or more nicknames but these nicknames have a lesser status than legal names. The following sections describe some of the peculiarities of symbolic links.

ln: Creates a Symbolic Link

Use ln with the symbolic (or s) option to create a symbolic link. The following example creates the symbolic link /tmp/s3 to the file sum in Alex's home directory. When you use the ls l command to look at the symbolic link, ls displays the name of the link and the name of the file it points to. The first character of the listing is l (for link):

 $ ln --symbolic /home/alex/sum /tmp/s3 $ ls -l /home/alex/sum /tmp/s3 -rw-rw-r--   1 alex alex 38 Jun 12 09:51 /home/alex/sum lrwxrwxrwx   1 alex alex 14 Jun 12 09:52 /tmp/s3 -> /home/alex/sum $ cat /tmp/s3 This is sum. 

The sizes and times of the last modification of the two files are different. Unlike a hard link, a symbolic link to a file does not have the same status information as the file itself.

Similarly you can use ln to create a symbolic link to a directory. When you use the symbolic option, ln does not care whether the file you are creating a link to is a regular file or a directory.

tip: Use absolute pathnames with symbolic links

Symbolic links are literal and are not aware of directories. A link that points to a relative pathname, which includes simple filenames, assumes that the relative pathname is relative to the directory that the link was created in (not the directory the link was created from). In the following example, the link points to the file named sum in the /tmp directory. Because no such file exists, cat gives an error message:

 $ pwd /home/alex $ ln --symbolic sum /tmp/s4 $ ls -l sum /tmp/s4 lrwxrwxrwx   1 alex     alex            3 Jun 12 10:13 /tmp/s4 -> sum -rw-rw-r--   1 alex     alex           38 Jun 12 09:51 sum $ cat /tmp/s4 cat: /tmp/s4: No such file or directory 


When you use a symbolic link as an argument to cd to change directories, the results can be confusing, particularly if you did not realize that you were using a symbolic link.

If you use cd to change to a directory that is represented by a symbolic link, the pwd builtin lists the name of the symbolic link. The pwd utility (/bin/pwd) lists the name of the linked-to directory, not the link, regardless of how you got there:

 $ ln -s /home/alex/grades /tmp/grades.old $ pwd /home/alex $ cd /tmp/grades.old $ pwd /tmp/grades.old $ /bin/pwd $/home/alex/grades 

When you change directories back to the parent, you end up in the directory holding the symbolic link:

 $ cd .. $ pwd /tmp $ /bin/pwd /tmp 

rm: Removes a Link

When you create a file, there is one hard link to it. You can delete the file or, using Linux terminology, remove the link with the rm utility. When you remove the last hard link to a file, you can no longer access the information stored there and the operating system releases for use by other files the space the file occupied on the disk. The space is released even if symbolic links to the file remain. When there is more than one hard link to a file, you can remove a hard link and still access the file from any remaining link. Unlike in DOS and Windows, there is no easy way in Linux to undelete a file once you have removed it. A skilled hacker can sometimes piece the file together with time and effort.

When you remove all the hard links to a file, you will not be able to access the file through a symbolic link. In the following example, cat reports that the file total does not exist because it is a symbolic link to a file that has been removed:

 $ ls -l sum -rw-r--r-- 1 alex pubs 981  May 24 11:05 sum $ ln -s sum total $ rm sum $ cat total cat: total: No such file or directory $ ls -l total lrwxrwxrwx 1 alex pubs 6  May 24 11:09 total -> sum 

When you remove a file, be sure to remove all symbolic links to it. Remove a symbolic link the same way you remove other files:

 $ rm total 

     < Day Day Up > 

    A Practical Guide to LinuxR Commands, Editors, and Shell Programming
    A Practical Guide to LinuxR Commands, Editors, and Shell Programming
    ISBN: 131478230
    EAN: N/A
    Year: 2005
    Pages: 213 © 2008-2017.
    If you may any questions please contact us: