Symbolic Links in Unix/Linux

Different file systems in the UNIX/Linux universe allow a variety of entries such as regular files, directories, sockets, named pipes, and links. In this article I will explain to you what links are, which types of links exist, how to create a symbolic link, and how to detect broken symbolic links easily. Links allow you to have multiple entry points into a file-system, allowing you to have fewer copies (sometimes only one) yet maintaining flexibility by having multiple ways to reach a given file.

Linking Entries

On the UNIX/Linux command line, the tool ln abbreviates the term link. It allows you to create an additional reference to a file, or directory. It does that by adding an additional name of an entry in the file allocation table of the file system. Having done that you can access the referenced file or directory with both the original name, and the new name, too. Think of a single person might be an employee, client and prospect.

The tool ln belongs to the list of essential software in Unix/Linux. On Debian GNU/Linux and Ubuntu it is part of the package coreutils.

There is a clear distinction between hard links, and soft links. Soft Links are named symbolic links, too. There are quite a few differences between the two types as listed below:

Hard Links Soft link (symbolic link)
Target must exist Target may already exist, but does not have to
Allowed within file systems only Allowed between different file systems
Links directly to the place the file is stored Links to the entry in the file system table (node)
Removing the link means removing the whole file Removing the link means removing the link to the node, not the file itself

Running the ln command without options creates a hard link from source to destination. With the help of the option -s it creates a symbolic link, instead. -s is the short name of the option, whereas --symbolic is the longer name. The link will be created in the current directory of the file system at the moment it is created. Developers just use the term symlink. In general, call it as follows:

$ ln -s [target] [link_name]

target is the file or directory to link to, and link_name is the name of the link that shall reference the target. As an example, this call creates a symbolic link from link_to_python to /usr/bin/python:

Example 1: Creating a symbolic link

$ ln -s /usr/bin/python link_to_python
$ ls -la link_to_python 
lrwxrwxrwx 1 frank frank 15 Oct  5 14:25 link_to_python -> /usr/bin/python

To see what ln does, a useful option is -v (--verbose for the longer option). This gives you further information on the action.

Example 2: Creating a symbolic link with additional information

$ ln -sv /usr/bin/python link_to_python
link_to_python -> /usr/bin/python

As you can see, the output of the command depicts the new link created.

Use Cases

First, a regular use case you may not have been aware of are two commonly used file system entries - . (the local directory) and .. (parent directory). These are implemented as symbolic links.

Second, developers install several versions of a program to do their tests. The usage of symbolic links can become quite handy to reference to the current version that is tested, and keeps two or more instances of it available without much trouble.

What if you delete a file that has a symbolic link pointing to it? We refer to these links with a non-existent "target" as "dead" links. To detect such cases the find command is quite helpful. Therefore, the option -L, and the action -type l comes into play. The -L flag tells find to follow symbolic links, while -type l will only match symbolic links.

In Example 3 the current directory contains two files named auto and backup, as well as two symbolic links - data pointing to auto, and generic pointing to files. Unfortunately, the files file/directory does not exist.

Free eBook: Git Essentials

Check out our hands-on, practical guide to learning Git, with best-practices, industry-accepted standards, and included cheat sheet. Stop Googling Git commands and actually learn it!

Using the find command, we can examine the links and output their names in case the link target does not exist. In our case it is the symbolic link named generic pointing to files that does not exist.

Example 3: Detecting broken links using find

$ ls -la
total 4
drwxr-xr-x  2 frank frank 1024 Oct  5 13:36 .
drwxrwxrwt 44 root  root  3072 Oct  5 13:35 ..
-rw-r--r--  1 frank frank    0 Oct  5 13:34 auto
-rw-r--r--  1 frank frank    0 Oct  5 13:34 backup
lrwxrwxrwx  1 frank frank    1 Oct  5 13:35 data -> auto
lrwxrwxrwx  1 frank frank    1 Oct  5 13:35 generic -> files
$ find -L . -type l

As an alternative, you may like the symlinks command. This is a non-default package available for both Debian GNU/Linux, and Ubuntu. With the two options -s and -v, symlinks detect the entries. As seen in Example 4 below, links without valid targets are classified as dangling.

Example 4: Detecting broken links using symlinks

$ symlinks -sv .
dangling: /directory/generic -> files
relative: /directory/data -> auto


The concept of symbolic links is no big mystery. Creating these references can simplify the use of software, and helps to test different versions of it on the same system. Keep in mind that the Linux Professional Institute (LPI) will ask you questions about it during certification for LPI1.


The author would like to thank Gerold Rupprecht for his support, and critics while preparing this article.

Last Updated: July 13th, 2023
Was this article helpful?

Improve your dev skills!

Get tutorials, guides, and dev jobs in your inbox.

No spam ever. Unsubscribe at any time. Read our Privacy Policy.

Frank HofmannAuthor

IT developer, trainer, and author. Coauthor of the Debian Package Management Book (

Make Clarity from Data - Quickly Learn Data Visualization with Python

Learn the landscape of Data Visualization tools in Python - work with Seaborn, Plotly, and Bokeh, and excel in Matplotlib!

From simple plot types to ridge plots, surface plots and spectrograms - understand your data and learn to draw conclusions from it.

© 2013-2024 Stack Abuse. All rights reserved.