32

I often find myself doing commands like this

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

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

| improve this question | | | | |
38

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
| improve this answer | | | | |
15

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
14

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.

| improve this answer | | | | |
6

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

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

| improve this answer | | | | |
2

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
1

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 | | | | |
0

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 ../../../../../../../../.."
| improve this answer | | | | |

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.