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.

Mikel
  • 56,387
  • 13
  • 130
  • 149
Xodarap
  • 3,613
  • 3
  • 20
  • 16
  • 1
    You mean `cd ~/a/really/long/path` then `cd ..` puts you in `~` at the moment? I can't reproduce that. – Mikel Apr 11 '11 at 05: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 Apr 11 '11 at 05:50
  • Is my edit accurate? I couldn't understand the question before. – Mikel Apr 11 '11 at 06:28

3 Answers3

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).

Faheem Mitha
  • 34,649
  • 32
  • 119
  • 183
Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175
4

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

cd $(readlink -f .)/..
dhasenan
  • 161
  • 1
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

Wipqozn
  • 141
  • 7