I often find myself doing commands like this


Is there a shortcut I can use that will cd ../ n times?

| improve this question | | | | |

No, there is no existing command for this, but it is trivial to write one. Add these lines to your ~/.bashrc file (thanks to D. Ben Knoble for pointing out that the variable should be local):

function ncd(){
  local path=""
  echo "Moving to $path" >&2
  cd "$path"

Save the file, open a new terminal, and you can now move N directories up using ncd N. For example:

$ pwd
$ ncd 5
Moving to ../../../../../
$ pwd
$ ncd 2
Moving to ../../
$ pwd
| improve this answer | | | | |

Coming from the Windows world, Alt + Up Arrow navigates to the parent directory in Windows Explorer. So I made something like this in ~/.inputrc:

"\33\33[A": "cd ..\n"

then pressing Alt + Up Arrow moves to the parent directory in the terminal. You have to press multiple times of course to move higher, but I have found it to be very fast. Also you can change the shortcut to your liking.

| improve this answer | | | | |
  • 1
    Thanks. Quite a nice solution – Mike Seeds Jan 11 at 23:51

You can easily create aliases or shell functions to perform the given task. I personally use these:

alias ..='cd ..'

and so on, manually defined for up to many-many dots in my .bashrc.

A shell function could instead easily take a numeric parameter, and execute cd .. in a loop that many times.

| improve this answer | | | | |

Similar to @terdon's answer, with slightly more natural usage and output:

# go up
up() {
  local count="${1:-1}"
  local path=../
  while (( --count > 0 )) ; do
  echo "cd -- $path"
  cd -- "$path"

This defines a function up, which has the following properties:

  • up n will go up n directories
  • up will go up exactly one directory (i.e., the default for n is 1)
  • output mimics that when using shopt -s autocd (hence the --, which are technically unnecessary)
  • as before, OLDPWD is set correctly to the current value of PWD, rather than one of the intermediate directories. This means that up 5; cd - works as expected.
| improve this answer | | | | |
  • Similar? That's the same, only more confusing. – rexkogitans Jan 12 at 13:48
  • I guess "torek" is me? :) Your addition of local makes a lot of sense, I should have thought of that myself! Then, you are defaulting to cd ../ when no input is passed, which is also good, but you don't actually explain any of these benefits, so they aren't obvious to the novice. The -- is pointless since you know the argument will always be a variation of ../. And you could simplify to while (( --count > 0 )) ; do to avoid the needless repetition of (( count-- )). But this is indeed a better version than mine, it's a shame you don't point out the benefits. – terdon Jan 12 at 14:16
  • @terdon eek! Sorry I was thinking of torek, who i see in tag:git a lot. Updates coming eventually. – D. Ben Knoble Jan 12 at 15:53
  • @rexkogitans what's confusing? I'd love to know to increase the readability. – D. Ben Knoble Jan 12 at 16:47
  • I admit that a function should declare all variables as local. My point in saying it's more confusing is - maybe subjective: for is more readable than while with a predecrement. Also, what does ${1:-1} do? If i did not oversee something, that's the same as just $1. I would also quote everything, like path="${path}../". – rexkogitans Jan 13 at 8:10

Using the printf hack:

function updir(){
    cd $(printf '../%.0s' {1..$1})

E.G. updir 5 will move you up 5 directories.

| improve this answer | | | | |
  • 2
    Yes, very clever ! The 0 also can be dropped, so printf '../%.s' works just as well – Sergiy Kolodyazhnyy Jan 13 at 8:07

Another possibility to consider is physically sending the keys if you have xdotool:

xdotool type ../

Assign it to a keyboard hotkey through Keyboard -> Shortcuts dialog. Then you can press the hotkey a required number of times.

| improve this answer | | | | |

If you use zsh you can use repeat:

repeat 5 { cd ..}
| improve this answer | | | | |
  • 1
    In [t]csh, repeat 5 cd .. works. (I can’t figure out how to get it to work with braces.) – G-Man Says 'Reinstate Monica' Jan 12 at 4:09

In Zsh, you can simply add a single dot per level, i.e.

  • cd ... equals to cd ../.. and
  • cd ...... equals to cd ../../../../..

Unfortunately, this cannot be used together with other path components, i.e. commands like

cd ...../foo

don’t work.

See also more tips on the cd command in Zsh.

| improve this answer | | | | |

I have used this for years:

alias up=" cd .."
alias up2="cd ../.."
alias up3="cd ../../.."
alias up4="cd ../../../.."
alias up5="cd ../../../../.."
| improve this answer | | | | |

Your Answer

