How to create a link in Linux

Updated: 11/13/2018 by Computer Hope
ln command

In your Linux file system, a link is a connection between a file name and the actual data on the disk. There are two main types of links that can be created: "hard" links, and "soft" or symbolic links. Hard links are low-level links which the system uses to create elements of the file system itself, such as files and directories.

Most users do not want to create or modify hard links themselves, but symbolic links are a useful tool for any Linux user. A symbolic link is a special file that points to another file or directory, which is called the target. Once created, a symbolic link can be used in place of the target file name. It can have a unique name, and be located in any directory. Multiple symbolic links can even be created to the same target file, allowing the target to be accessed by multiple names.

The symbolic link is a file in its own right, but it does not contain a copy of the target file's data. It is similar to a shortcut in Microsoft Windows: if you delete a symbolic link, the target is unaffected. Also, if the target of a symbolic link is deleted, moved, or renamed, the symbolic link is not updated. When this happens, the symbolic link is called "broken" or "orphaned," and will no longer function as a link.

How to create symbolic links using a file manager

One way to create a symbolic link in the X Windows GUI (graphical user interface) is with your file manager. Some Linux distributions use different file managers, but the process is similar. Locate a target file in your file manager GUI, highlight it by clicking it once, and select the "create a link" option. This option is usually found under the Edit menu, or in the context menu shown when you right-click the highlighted file.

Creating symbolic links with a Linux file manager

In the example shown above, using the Thunar file manager, we have highlighted the file myfile.txt, then selected Make Link in the Edit menu. After completed, a new symbolic link called link to myfile.txt is created. This link can be renamed or moved to another location. It always points to the target, unless the target is later moved or deleted, resulting in the link becoming orphaned.

How to create symbolic links from the command line

The command line is a powerful tool in Linux because it gives you greater control over your commands. (For more information about the command line, and how to access it from Linux, see our Linux and Unix shell tutorial).

You can create symbolic links using the ln command's -s option. The general syntax for creating a symbolic link is:

ln -s target linkname

For instance, if we have a file in our working directory called myfile.txt, and we want to create a symbolic link in the same directory called mylink, we could use the command:

ln -s myfile.txt mylink

In this command, we have opened a terminal session that places us at our shell's command prompt. We are logged in a system named myhost as a user named user, and our working directory is a folder in our home directory called myfolder:

First, let's use ls with the -l option to produce a long list of all the files in our directory:

output of command: ls -l

We see our file, myfile.txt, which is the only file in the directory. ("total 4" refers to how many blocks on the disk are used by the files listed, not the total number of files).

Let's use the cat command to view the contents of myfile.txt:

output of command: cat myfile.txt

Now, let's create a symbolic link to mylink.txt called mylink using the ln -s command:

ln -s myfile.txt mylink

It seems like nothing happened, but this means it worked as expected. If there was an error, or if an unexpected condition was encountered, we would receive a notification.

Now, if we do another ls -l, we see two files — our target and our link:

output of command: ls -l, displaying link and target

One of the benefits of doing a long listing with "-l" is that we see extra information in addition to the file name. Notice the "l" at the beginning of the line containing our link name, indicating that the file is a symbolic link. Also, after mylink (in blue text) is the "->" symbol, followed by the name of the target.

Tip

Most shells, by default, are configured to display certain file types in different colors, but your terminal might show different colors or none at all.

Now, let's use our symbolic link. If we run cat on it, it displays the contents of myfile.txt:

output of cat command

We can rename our link with mv, and it still points to the same target:

Renamed symbolic links still function properly.

But what happens if we move our link somewhere else? In this case, our link breaks. We can see this by making a new directory using mkdir, and moving the link into the new directory using mv:

Moving the link to another location breaks the link, because the link did not specify an absolute path

You can see that when we view the contents of directory newfolder with ls -l, our link is highlighted in red, indicating that it is a broken link. If we try to cat the contents of the link, the shell informs us that the file does not exist. It points to "myfile.txt" with no other path information. Therefore, the operating system looks for myfile.txt in the same directory as the link.

Let's start over by removing newfolder and its contents using the command rm -r:

starting over

This time, let's create the symbolic link using the absolute path to myfile.txt. Let's double check the name of our working directory using pwd:

output of the pwd command

Our working directory is /home/user/myfolder, so let's include this in the target name when we create the link:

Creating a symbolic link using an absolute path in the target name.

As you can see from the output of ls -l, our link now points to the file /home/user/myfolder/myfile.txt. With this path information, we can move the link to another location, and it still points to our target:

Our symbolic link, which points to an absolute path name, works even when moved to a new location.

Tip

Your bash shell keeps an environment variable called $PWD that always stores the value of your working directory. You can use this variable to insert the full path before your target name, as long as the target is in your working directory. We can view the value of $PWD using the echo command:

Checking the value of the $PWD environment variable

This text is inserted if we use $PWD as part of a command. It is a good idea to enclose it in quotes as "$PWD" in case the directory name has any spaces. The quotes make sure the shell knows they are part of the pathname and not command separators.

Here is our command, and a directory listing to show that it worked:

Using the $PWD environment variable to create a symbolic link.

Notice that we also put a slash ("/") directly between "$PWD" and myfile.txt to complete the full path name.