Volte diretórios bem rápido (ou, um "cd .." tunado!)

TL;DR você vai conseguir fazer isso: alt text

Intro

Se você desenvolve software, é possível que aprecie a linha de comando como uma ferramenta de produtividade. Este é o meu caso, e algumas ferramentas que facilitam minha vida de desenvolvedor incluem: vim, tmux e zsh.

Uma coisa que eu gosto no zsh é o atalho .. para voltar 1 diretório. Assim:

$ pwd
~/dev/teach/blog
$ ..
$ pwd
~/dev/teach

Apenas evita ter que digitar o comando cd .. completo, mas é muito útil!

O que faltava

O que eu queria, no entanto, era uma maneira de voltar N diretórios. Para que eu pudesse fazer isso:

$ pwd
~/dev/teach/blog
$ .. 2
$ pwd
~/dev

Então eu criei fastnav_up, uma função em shell script que faz exatamente isso. É bem simples:

fastnav_up() {
    # if no parameters, navigate up only 1 directory and stop
    [ -z "$1" ] && cd .. && return 0

    # filter parameter $1, should contains only numbers
    [ "$( echo $1 | sed "s/[0-9]*//g" )" ] && echo "\$1 must be a number" && return 1 || n=$1

    dirs_up=
    for i in $(seq $1); do
        dirs_up+="../"
    done
    cd $dirs_up

    return 0
}
alias ..="fastnav_up"

Observe que o bash não nos permite usar o caractere ponto (.) dentro de um nome de função, mas isso pode ser facilmente superado com um alias :)

E simplesmente funciona! Na verdade, eu criei isso há alguns anos, e tem me salvado muito tempo desde então.

Eu quero mais

Tudo bem, o novo .. 2 é legal, mas e se eu quisesse contar de trás pra frente? Tipo, se eu estiver em um caminho muito longo, pode ser difícil contar quantos diretórios subir.

Para isso eu criei o fastnav_down (alias para ,,), que funciona assim:

$ pwd
~/dev/teach/blog/resources/_gen/images
$ ,, 1
$ pwd
~/dev/

O código também é simples:

fastnav_down() {
    [ "$( echo $1 | sed "s/[0-9]*//g" )" ] && echo "\$1 must be a number" && return 1 || n=$1

    # separate path components into a string array
    a=( $(echo $(pwd) | sed "s;\/; ;g") )

    ((n+=2)) # we are starting from /home/<your-user>/
    dir=$(echo "${a[@]:0:$n}" | sed "s; ;\/;g") # slice the array and put slashes back
    cd /$dir

    return 0
}
alias ,,="fastnav_down"

Aproveite!

Se você achou isso útil, pode querer adicionar os .. e ,, melhorados ao seu .bashrc (ou .zshrc, etc.). Uma versão comentada deles está disponível neste github gist, e uma maneira automatizada de adicioná-la é:

$ wget https://gist.githubusercontent.com/geonnave/335fa20e82a19d9fb177d65e27828fe2/raw/709a98cdb6b6b514b66c31a6cab4af41f99a3793/fastnav.sh && chmod +x fastnav.sh && echo "source $(pwd)/fastnav.sh" >> $HOME/.bashrc

(nota: se você estiver usando zsh, mude .bashrc para .zsh)


Post originalmente publicado aqui (em inglês).

Então eu criei fastnav_up, uma função em shell script que faz exatamente isso. É bem simples:

Muito massa esse script!

Só por curiosidade tem o comando cd - que é bastante útil para voltar ao diretório anterior.

Uma coisa massa do `cd -` no zsh é que se você apertar tab ele sugere um histórico de diretórios de onde você já esteve.
Sensacional `Lajack`, não sabia que tinha como fazer isso. Obrigado pela dica 🤝 ![Imgur](https://i.imgur.com/EBnIe2N.png)

Excelente post!

Só uma curiosidade: é possível voltar mais de um diretório com o ... Basta adicionar a quantidade que deseja. Ex:

$ pwd
~/dev/teach/blog/resources/_gen/images
$ ....
$ pwd
~/dev/teach/blog

Mas a sua solução é realmente bem mais prática, principalmente com ,,. Valeu!

eu estou com uma build de arch aqui, monstar foi um saco, perdi algumas horinhas com o cd ~, vlw dms pela dica!

Que bom que vai ser útil! Eu tive a ideia justamente mexendo com sistemas operacionais, na época eu compilava o Android no trabalho e também perdia muito tempo percorrendo diretórios enormes (ex.: [android/platform/frameworks/opt/net/wifi/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java](https://android.googlesource.com/platform/frameworks/opt/net/wifi/+/refs/heads/master/libs/WifiTrackerLib/src/com/android/wifitrackerlib/BaseWifiTracker.java))