Going into a directory linked by a link

When I cd a link, my current path is prefixed with the link’s path, rather than the path of the directory the link links to.
E.g.

~/dirlinks/maths$ ls -l logic
lrwxrwxrwx 1 tim tim 71 Jul 27 10:24 logic -> /windows-d/academic discipline/study objects/areas/formal systems/logic

~/dirlinks/maths$ cd logic
~/dirlinks/maths/logic$ pwd
/home/tim/dirlinks/maths/logic

~/dirlinks/maths/logic$ cd ..
~/dirlinks/maths$

I would like to have my current path changed to the path of the linked dir, so that I can work with the parent dirs of the linked dir as well. Besides ls the link to find out the linked dir, and then cd into it, what are some simpler ways to accomplish that? For example, after cd into a link, how do you change your current path to the path of the linked dir?

Asked By: Tim

||

With POSIX shell, you can use -P option of cd builtin:

cd -P <link>

With bash, from man bash:

The -P option says to use the physical directory structure instead
of following symbolic links (see also the -P option to the set
builtin command)

Answered By: cuonglm

You can use readlink to determine where your link points, and provide this output as the target of your cd.

cd "$(readlink <link>)"

In the case of additional symlinks pointing to symlinks, readlink will simply provide the target, unless you specify one of it’s options to follow symlinks to a canonical file target, for example readlink -f <link>.

readlink – print value of a symbolic link or canonical file name

-f, –canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist

-e, –canonicalize-existing
canonicalize by following every symlink in every component of the given name recursively, all components must exist

-m, –canonicalize-missing
canonicalize by following every symlink in every component of the given name recursively, without requirements on components existence

Answered By: Jon Surrell

Korn-like shells keep track of symbolic links in the path to the current directory (this is known as logical current directory tracking). If you want to expand all symbolic links, pass the option -P to the cd builtin (for physical current directory tracking):

cd -P logic

If you’re in a directory which you’ve accessed via a symbolic link and want to switch the tracked current directory to the path with symbolic links expanded, run

cd -P .

If you want to print the path to the current directory with symbolic links expanded, run pwd -P. In bash, if you want to turn off logical tracking, run set -P; in zsh, run set -w or setopt chase_links.

Categories: Answers Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.