33

I often find myself doing commands like this

cd ../../../../../

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

7

9 Answers 9

39

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=""
  for ((i=1;i<=$1;i++)); do
    path="../$path"
  done
  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
/home/terdon/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9
$ ncd 5
Moving to ../../../../../
$ pwd
/home/terdon/dir1/dir2/dir3/dir4
$ ncd 2
Moving to ../../
$ pwd
/home/terdon/dir1/dir2
16

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.

2
  • 1
    Thanks. Quite a nice solution
    – Mike Seeds
    Jan 11, 2020 at 23:51
  • This is wonderful. I had trouble getting the arrow keys to bind under Debian, so I used Alt-u instead: "\eu": "cd ..\n" .inputrc can be immediately reloaded with bind -f ~/.inputrc Apr 7 at 18:51
15

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

alias ..='cd ..'
alias ...='cd ../..'
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.

7

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
    path="$path"../
  done
  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.
6
  • Similar? That's the same, only more confusing. Jan 12, 2020 at 13:48
  • 1
    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, 2020 at 14:16
  • @terdon eek! Sorry I was thinking of torek, who i see in tag:git a lot. Updates coming eventually. Jan 12, 2020 at 15:53
  • @rexkogitans what's confusing? I'd love to know to increase the readability. Jan 12, 2020 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}../". Jan 13, 2020 at 8:10
4

Using the printf hack:

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

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

1
  • 2
    Yes, very clever ! The 0 also can be dropped, so printf '../%.s' works just as well Jan 13, 2020 at 8:07
2

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.

2

If you use zsh you can use repeat:

repeat 5 { cd ..}
1
  • 1
    In [t]csh, repeat 5 cd .. works. (I can’t figure out how to get it to work with braces.) Jan 12, 2020 at 4:09
2

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.

1

I have used this for years:

alias up=" cd .."
alias up2="cd ../.."
alias up3="cd ../../.."
alias up4="cd ../../../.."
alias up5="cd ../../../../.."
alias up6="cd ../../../../../.."
alias up7="cd ../../../../../../.."
alias up8="cd ../../../../../../../.."
alias up9="cd ../../../../../../../../.."

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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