Why doesn't my symbolic link work?

Symlinks tend to like full paths or relative to the link, otherwise they can often be looking for file-1.txt locally (oddly enough).

Navigate to proper and execute ls -l and you can see that the symlink is looking for actual/file-1.txt, when it should be ../actual/file-1.txt.

So you have two options:

  1. Give the full path

    ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper
    
  2. Navigate to the folder you want the link to be in and link from there

    cd proper
    ln -s ../actual/file-1.txt ../actual/file-2.txt ./
    

Edit: A hint to save typing.

You could just do ln -s ~/actual/file-{1,2}.txt ~/proper

The items in the curly braces are substituted and placed after each other, creating the command

    ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper
    

which links both files to the target directory. Saves some major typing as you get further on in the shell.


The problem is the usage of relative paths. If you specify your link creation with the full explicit path, it works.

$ ln -s ~/actual/file1.txt ~/actual/file2.txt ~/proper/

$ cat proper/file1.txt

file 1

$

Your example creates links in proper that look for a subdirectory named actual under the current directory, rather than your intended parent-of-both.


Symbolic links can be tricky.  In essence, a symbolic link is a file that contains a filename/pathname for another file (and that is flagged for special treatment).  If the pathname in the link file begins with ‘/’, then it is treated as an absolute pathname, and things are fairly straightforward.  If it doesn’t begin with a slash, it is treated as a relative pathname — relative to the directory where the link is located.  (This is true whether or not the name contains slashes.)  So, you created proper/file–1.txt as a link to “actual/file–1.txt”, and when you tried to access it, the system tried to access proper/actual/file–1.txt.  You should have said

ln –s  ../actual/file–1.txt  ../actual/file–2.txt  proper

By the way, you didn’t need the touch commands.  echo "file 1" > actual/file–1.txt is sufficient to create actual/file–1.txt.