Shell - Navigate up 'N' Directories
I Often Find Myself Doing Commands Like This Cd. ./. ./. ./. ./. ./ Is There a Shortcut I Can Use That Will Cd. ./ N Times? 7 9 Answers No, There Is No...
I often find myself doing commands like this
cd ../../../../../
Is there a shortcut I can use that will cd ../ n times?
9 Answers
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
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.
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.
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 nwill go upndirectoriesupwill go up exactly one directory (i.e., the default fornis 1)- output mimics that when using
shopt -s autocd(hence the--, which are technically unnecessary) - as before,
OLDPWDis set correctly to the current value ofPWD, rather than one of the intermediate directories. This means thatup 5; cd -works as expected.
Using the printf hack:
function updir(){
cd $(printf '../%.0s' {1..$1})
}
E.G. updir 5 will move you up 5 directories.
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.
If you use zsh you can use repeat:
repeat 5 { cd ..}
In Zsh, you can simply add a single dot per level, i.e.
cd ...equals tocd ../..andcd ......equals tocd ../../../../..
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.
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 ../../../../../../../../.."