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?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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)
Method 2
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.
Method 3
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
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0