Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

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?

share|improve this question

3 Answers 3

up vote 15 down vote accepted

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)

share|improve this answer
3  
You can do this cd -P . after the original cd. –  richard Jul 27 at 21:00

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.

share|improve this answer

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

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.