Aqui está uma função que faz o que você quer:
cdto () { cd "${PWD%/$1/*}/$1"; }
Aqui está outro prático:
c2 () {
local path num
if (($# != 0))
then
path='./'
fi
if [[ -z ${1//.} ]]
then
num=${#1}
elif [[ -z ${1//[[:digit:]]} ]]
then
num=$1
else
echo "Invalid argument"
return 1
fi
for ((i=0; i<num-1; i++))
do
path+='../'
done
cd $path
}
Uso:
c2 . # same as cd .
c2 .. # same as cd ..
c2 ... # same as cd ../..
c2 3 # also same as cd ../..
c2 # same as cd (which is the same as cd ~)
Eu achei que um dos shells costumava ter o recurso cumulativo dot-dot-dot (cheguei a verificar o Vista agora e não o tinha, embora o Google afirme que algumas versões do Windows o fazem).
Editar
Um recurso não documentado do Bash é que muitos caracteres são aceitáveis em nomes de função. Como resultado, você pode fazer isso:
.. () { cd ..; }
... () { cd ../..; }
.... () { cd ../../..; }
..... () { cd ../../../..; }