How to: Linux / UNIX create soft link with ln command

Posted on in Categories , , , , , , , , last updated March 7, 2017

What is a soft (“symbolic”) link? How do I create a soft link (symbolic link) under UNIX or Linux operating system?

To make links between files you need to use ln command. A symbolic link (also known as a soft link or symlink) consists of a special type of file that serves as a reference to another file or directory. Unix/Linux like operating systems often uses symbolic links.

Symbolic links can be made to directories as well as to files on different filesystems or different partitions.
Symbolic links can be made to directories as well as to files on different filesystems or different partitions.

Two types of links

There are two types of links

  • symbolic links: Refer to a symbolic path indicating the abstract location of another file
  • hard links : Refer to the specific location of physical data.

How do I create soft link / symbolic link?

Soft links are created with the ln command. For example, the following would create a soft link named link1 to a file named file1, both in the current directory
$ ln -s file1 link1
To verify new soft link run:
$ ls -l file1 link1
Sample outputs:

-rw-r--r--  1 veryv  wheel  0 Mar  7 22:01 file1
lrwxr-xr-x  1 veryv  wheel  5 Mar  7 22:01 link1 -> file1

From the above outputs it is clear that a symbolic link named ‘link1’ contains the name of the file named ‘file1’ to which it is linked. So the syntax is as follows to create a symbolic link in Unix or Linux, at the shell prompt:
$ ln -s {source-filename} {symbolic-filename}

For example create a softlink for /webroot/home/httpd/ as /home/vivek/index.php, enter the following command:
$ ln -s /webroot/home/httpd/ /home/vivek/index.php
$ ls -l

Sample outputs:

lrwxrwxrwx 1 vivek  vivek    16 2007-09-25 22:53 index.php -> /webroot/home/httpd/

You can now edit the soft link named /home/vivek/index.php and /webroot/home/httpd/ will get updated:
$ vi /home/vivek/index.php
Your actual file /webroot/home/httpd/ remains on disk even if you deleted the soft link /home/vivek/index.php using the rm command:
$ rm /home/vivek/index.php ## <--- link gone ##
## But original/actual file remains as it is ##
$ ls -l /webroot/home/httpd/

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin and a trainer for the Linux operating system/Unix shell scripting. He has worked with global clients and in various industries, including IT, education, defense and space research, and the nonprofit sector. Follow him on Twitter, Facebook, Google+.

63 comment

  1. I executed this comment successfully and created a soft link. When I tried browsing to “/home/vivek.index.php” it shows “403 Forbidden error is thrown. Is there is any possibility to browse on the same?

      1. Please don’t ever do: chmod -R 777 /var/www or chmod 777 anywhere in your web accessible directories. I won’t bother telling what security risks this will open up. You can google it.

        You should be giving the least permission needed to your directories and files on a web server. If you’re not sure what permissions are needed than learn more about how *nix permissions work and how your server works. here is a good place to start:

  2. This error 403 access forbidden, means that a request for a “bare” directory path has been made, no default directory index page is present and the site manager does not want a file listing displayed in its place.
    If you have problems accessing a particular file or directory, ensure that the Web server has permission to read those files. Usually, the Web server will operate under a special user account, so make sure that user has read permission.

    In this case, either create an index for that directory or change the settings to permit directory listings. For Apache, use the Options +Indexes directive in the .htaccess file for the directory.

        1. There are a lot of conflicting comments here.

          1. Generally speaking, a directory *is a file* for the purposes of a symbolic link, i.e., you don’t need to do anything different.

          2. The LINK points to the TARGET.

          3. The TARGET is relative to the LINK.

          4. The syntax is ln -s TARGET LINK

          So suppose you have the following hard directory:
          and you want to create a symlink to it in your webroot located at

          Then do:

          ln -s /var/www/App/Vendor/VendorPublicDir /var/www/App/Webroot/VendorPublicDirLink

          … this creates a LINK in /var/www/App/Webroot named VendorPublicDirLink that points to the TARGET /var/www/App/Vendor/VendorPublicDir

          – or –

          ln -s ../Vendor/VendorPublicDir /var/www/App/Webroot/

          … this creates a LINK in /var/www/App/Webroot named VendorPublicDir (it defaulted to the TARGET name here because the LINK is an existing directory). The LINK points to the TARGET ../Vendor/VendorPublicDir (which is relative to /var/www/App/Webroot; where you run the command from doesn’t matter).

  3. Hi,

    Wanted to confirm the information I had. Great info, it worked.

    Created a soft link for apache-tomcat


    Soft Link
    ln -s /directory/of/application/ /directory/and/softlink

    e.g. ln -s /usr/local/apache-tomcat /usr/local/apache
    This created an ‘apache’ softlink to apache-tomcat directory

    ls -l
    apache -> /usr/local/apache-tomcat

    To use hard link, just remove the -s option

    Hope this helps.

  4. “Pla tell me ,in what scenario,we can use soft link and hard link.”

    I am trying to use a symbolic link (soft link) to allow multiple websites to share a css style that is beyond each sites root directory.

  5. darshan 10.26.09 at 2:47 am
    My soft links are not visible through http:
    how do I make sure that web server has access to those folder.
    Please give the exact set of commands.

    that depends on your webserver, for apache:

    Options Indexes FollowSymLinks

  6. Please make sure that the file which you are accessing is having a read access for web server.

    If you are accessing a file under the home directory of a user there might not be read access for home directorates.

    means /home/user folder will be with 700 (drwx——) permission. So you would need to set 755 permission for /home/user folder if you need to access the file through URL.

  7. Hi,
    I have a couple symboliclink questions:

    1. How can I create a symboliclink between two filesystems?
    Do I need to have a mount point to the second filesystem first then create a link to it?

    2. If I copy a file with that has a symboliclink to another filesystem, will it lose the link?


  8. Really thanks guyz…. I created link successfully.

    CASE: Actually user PC “/” is completely filled, so that user is unable to login. But he is able to login as super user. “/” is 100%.

    SOLUTION: I find that /usr and /var is occupying more space, so wat i did is I moved content of /usr directory to /work directory (free space) and did ln -s /usr/include /work/name of the link . Thats it all files are physically in /work direcory but logically it is pointing to /usr/include place.

    After rebooting user is able to work with his login, gained space in “/”.


  9. One more thing we need to consider as a security treat, some softwares have default UserID and Password like phpmyadmin and other softwares, after installation of this kind of software’s we need to take care of userID and Password.

  10. I was having some trouble creating a symlink to a directory, and I discovered that it was caused by my using a relative path for the target (e.g. “..”). When I used an absolute path, it worked like a charm!

  11. Hi All,
    i am getting the below output in file
    get_history(): getting history
    2068, 2986, 6408, 7546, 7555, 7893, 7963, 8219, 8270, 8313, 8410, 8479, 8581, 8607, 8724, 8783, 8804, 8992, 9018, 9018, 9100, 9127, 9157, 9232, 9236, 9269, 9291, 9388, 9565, 9661, 9668, 9850, 9862, 10004, 10004, 10031, 10063, 10834, 12087, 13444
    … got 40 historical records
    lower: 11354 ? 3000 < 9018 = 0
    upper: 11354 ? 9018 < 7000 = -215

    9018 is todays number….i want to compaire this number with all above list of number one by one…..please solution mail me on [email protected]


    1. symbolic link is use to share file between two people. For example, Mr A hired Mr B and what Mr.B to work in his file, instaed of giving him his system, he linked his file to Mr.B with New file name. Name whatever work Mr.B do will update to Mr.A file. and you can do that with this command,
      ln -s /home/Mr.A/Mr-file.txt /home/Mr.B/newfile.txt

      hope this helps

  12. Hi All,

    Currently my application is running on the local HDD partition. The path of application is /usr/local/app.Kindly suggest how we can change the default path to shared storage volume as we are plan to do OS linux clustering.

  13. This is the hugest pet peeve when people try to explain *Nix stuff. You’re explaining it to people who already understand what ln does. Your use of “target-filename” “symbolic-filename” don’t make sense for someone who doesn’t understand ln to begin with.

    Your description doesn’t make sense either

    “For example create softlink for /webroot/home/httpd/ as /home/vivek/index.php, enter the following command:”

    Should read something like “To symbolicly link an existing file ‘/webroot/home/httpd/’ to this location ‘/home/vivek/index.php'”

    Nothing is explicitly indicating what is symbolic and what actually exists. Either that or use terminology like source / destination. As both arguments here can be interpreted as targets per how other *nix commands are used and documented.

  14. Hi, everyone! This is so far what did I achieve. Can someone help with symbolic links? I couldn’t create a symbolic link between diretories.
    [[email protected] folder2]# cd /root/folder
    [[email protected] folder]# ll
    total 8
    -rw-r–r–. 1 root root 19 Jul 27 13:07 file1
    -rw-r–r–. 1 root root 0 Jul 27 12:20 file2
    -rw-r–r–. 1 root root 0 Jul 27 12:20 file3
    -rw-r–r–. 1 root root 0 Jul 27 12:20 file4
    -rw-r–r–. 1 root root 0 Jul 27 12:20 file5
    -rw-r–r–. 1 root root 0 Jul 27 12:20 kgt
    -rw-r–r–. 1 root root 11 Jul 27 12:56 kgz
    [[email protected] folder]# ln -s kgz /root/
    [[email protected] folder]# ls -l
    total 8
    -rw-r–r–. 1 root root 19 Jul 27 13:07 file1
    -rw-r–r–. 1 root root 0 Jul 27 12:20 file2
    -rw-r–r–. 1 root root 0 Jul 27 12:20 file3
    -rw-r–r–. 1 root root 0 Jul 27 12:20 file4
    -rw-r–r–. 1 root root 0 Jul 27 12:20 file5
    -rw-r–r–. 1 root root 0 Jul 27 12:20 kgt
    -rw-r–r–. 1 root root 11 Jul 27 12:56 kgz
    [[email protected] folder]# cd
    [[email protected] ~]# ls
    1 Desktop Downloads folder2 install.log.syslog Music Pictures Templates
    anaconda-ks.cfg Documents folder install.log passwd Public Videos
    [[email protected] ~]# cd folder
    [[email protected] folder]# ls
    file1 file2 file3 file4 file5 kgt kgz
    [[email protected] folder]# cat kgz
    [[email protected] folder]# cd
    [[email protected] ~]# cat
    cat: No such file or directory
    [[email protected] ~]#

  15. Before executing the command, should i change my directory to the parent directory so that the the file(target file name) which i intended to point to an another one(symbolic file name) points out in every other child directories present inside the parent directory?? OR can i just execute the command irrespective of which directory i am in??

Leave a Comment