33

I have a symlink

~/link -> ~/a/really/long/path

When I do

cd ~/link
cd ..    

it takes me to

~

but I want to go to

~/a/really/long

Is there a way to do this?

I am using bash.

3
  • 1
    You mean cd ~/a/really/long/path then cd .. puts you in ~ at the moment? I can't reproduce that.
    – Mikel
    Commented Apr 11, 2011 at 5:13
  • 2
    @Mikel: No, first create a symlink to ~/a/really/long/path then cd to that then to ... You should end up back in ~ (assuming that's where you started).
    – Xodarap
    Commented Apr 11, 2011 at 5:50
  • Is my edit accurate? I couldn't understand the question before.
    – Mikel
    Commented Apr 11, 2011 at 6:28

3 Answers 3

41

Bash (as well as ksh, zsh, and even ash) track directory changes so that cd /foo/bar && cd .. always takes you to /foo even if bar is a symlink. Pass the -P option to cd to ignore the tracked change and follow the “physical” directory structure:

cd -P ..

See help cd or man builtins for documentation about the bash builtin cd. If you really dislike the directory tracking feature, you can turn it off with set -P in bash (set -o no_chase_link in zsh).

4
  • 1
    The way I read the question, the OP has -P or -o physical already set?
    – Mikel
    Commented Apr 11, 2011 at 5:14
  • +1, but suggest link to man page. Commented Apr 11, 2011 at 8:00
  • @Mikel: No, the question says that he is following the symbolic link, not the physical directory structure. Commented Apr 11, 2011 at 8:02
  • Sorry, I didn't actually try to edit your post. Suggested edit submitted now. Commented Apr 11, 2011 at 10:00
4

You can also use readlink to find the physical path to this directory, then go one directory higher:

cd $(readlink -f .)/..
3

One method you could use is to use an alias instead of a symlink to take you to ~/a/really/long/path. That's the method I use, since then I can just type a simple 1/2/et cetera letter command instead of cd symlink

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .