Navegação rápida no diretório do shell bash

119

Eu gostaria de alternar frequentemente entre diretórios que estão em caminhos totalmente não relacionados, por exemplo /Project/Warnest/docs/ e ~/Dropbox/Projects/ds/test/ .

Mas não quero digitar cd /[full-path]/ o tempo todo. Existe algum comando de atalho para mudar para diretórios trabalhados anteriormente?

Uma solução que consegui pensar é adicionar variáveis de ambiente ao meu bash .profile para os diretórios usados com frequência e cd para eles usando essas variáveis.

Mas existe alguma outra solução para isso?

    
por saiy2k 08.02.2012 / 08:33

35 respostas

134

Se você estiver apenas alternando entre dois diretórios, poderá usar cd - para ir e voltar.

    
por 08.02.2012 / 10:45
62

Há uma variável de shell CDPATH em bash e ksh e cdpath em zsh :

CDPATH    The search path for the cd command. This is a colon-separated
          list of directories in which the shell looks for destination
          directories specified by the cd command.

Para que você possa definir em seu ~ / .bashrc:

export CDPATH=/Project/Warnest:~/Dropbox/Projects/ds

Em seguida, cd docs e cd test levarão você ao primeiro diretório encontrado. (Quero dizer, mesmo que exista um diretório com o mesmo nome no diretório atual, CDPATH ainda será consultado. Se CDPATH contiver mais diretórios com subdiretórios com o nome especificado, o primeiro será usado.)

    
por 08.02.2012 / 12:19
48

Outra coisa que você pode tentar é uma ferramenta chamada autojump . Ele mantém um banco de dados de chamadas para seu alias ( j por padrão) e tenta tomar decisões inteligentes sobre onde você quer ir. Por exemplo, se você digitar com freqüência:

j ~/Pictures

Você pode usar o seguinte para chegar ao ponto desejado:

j Pic

Ele está disponível no Debian e no Ubuntu, e incluído por usuário em ~/.bashrc ou ~/.zshrc por padrão.

    
por 08.02.2012 / 23:13
39

Se for um pequeno número de diretórios, você pode usar pushd para alternar entre eles:

# starting point
$ pwd
/Project/Warnest/docs
# add second dir and change to it
$ pushd ~/Dropbox/Projects/ds/test
~/Dropbox/Projects/ds/test /Project/Warnest/docs
# prove we're in the right place
$ pwd
~/Dropbox/Projects/ds/test
# swap directories
$ pushd
/Project/Warnest/docs ~/Dropbox/Projects/ds/test

ao contrário de cd - , você pode usar isso com mais de dois diretórios

Seguindo a sugestão de Noach, estou usando agora:

function pd()
{
    if [[ $# -ge 1 ]];
    then
        choice="$1"
    else
        dirs -v
        echo -n "? "
        read choice
    fi
    if [[ -n $choice ]];
    then
        declare -i cnum="$choice"
        if [[ $cnum != $choice ]];
        then #choice is not numeric
            choice=$(dirs -v | grep $choice | tail -1 | awk '{print $1}')
            cnum="$choice"
            if [[ -z $choice || $cnum != $choice ]];
            then
                echo "$choice not found"
                return
            fi
        fi
        choice="+$choice"
    fi
    pushd $choice
}

uso de exemplo:

# same as pushd +1
$ pd 1

# show a prompt, choose by number
$ pd
 0 ~/Dropbox/Projects/ds/test
 1 /Project/Warnest/docs
 2 /tmp
? 2
/tmp ~/Dropbox/Projects/ds/test /Project/Warnest/docs

# or choose by substring match
$ pd
 0 /tmp
 1 ~/Dropbox/Projects/ds/test
 2 /Project/Warnest/docs
? doc
/Project/Warnest/docs /tmp ~/Dropbox/Projects/ds/test

# substring without prompt
$ pd test
~/Dropbox/Projects/ds/test /Project/Warnest/docs /tmp

Obviamente, isso é apenas para girar a pilha e não é possível adicionar novos caminhos - talvez eu deva renomeá-lo.

    
por 08.02.2012 / 13:57
14

Eu uso alias no bashrc para fazer esses cds.
como:

alias wdoc='cd ~/Project/Warnest/docs'
alias dstest='cd ~/Dropbox/Projects/ds/test'
    
por 08.02.2012 / 08:39
11

Eu encontrei um script (normalmente chamado acd_funch.sh) que resolveu esse problema para mim. Com isso, você pode digitar cd -- para ver os últimos 10 diretórios que você usou. Será algo parecido com isto:

0  ~/Documents/onedir
1  ~/Music/anotherdir
2  ~/Music/thirddir
3  ~/etc/etc

Para ir para ~/Music/thirddir , basta digitar cd -2

Referências

OBSERVAÇÃO: Este script foi originalmente publicado em um artigo da Gazeta do Linux que está disponível aqui: acd_func.sh - estende o CD do bash para manter, exibir e acessar o histórico de nomes de diretórios visitados .

    
por 09.02.2012 / 04:30
10

Experimente a opção cdable_vars shell no bash. Você o liga com shopt -s cdable_vars .

Então você precisa definir suas variáveis export dir1=/some/path . e finalmente cd dir1 , etc. Você pode colocá-lo no seu ~/.bashrc para colocá-lo em pé.

    
por 08.02.2012 / 23:39
10

Use "pushd -n " (supondo que você use o bash).

Adicione ao seu ~ / .bashrc:

pushd -n /Project/Warnest/docs/
pushd -n ~/Dropbox/Projects/ds/test/

então,

cd ~ é sua casa,

cd ~1 é ~/Dropbox/Projects/ds/test/

cd ~2 é /Project/Warnest/docs/

Você pode usar ~1 , ~2 etc exatamente da mesma maneira que ~ .

    
por 09.02.2012 / 15:26
7

Há muitas boas sugestões aqui. O que usar dependerá se você tem uma pequena lista fixa de diretórios com os quais você alterna ou se está procurando uma solução mais genérica.

Se for uma pequena lista fixa, a configuração de aliases simples (como Felix Yan sugeriu) seria mais fácil de usar.

Se você está procurando uma solução mais generalizada (ou seja, muitos diretórios diferentes, mudando com o tempo), eu usaria pushd e popd (como Useless sugerido). Eu pessoalmente acho que o padrão pushd / popd é difícil de usar, especialmente quando você começa a alternar entre muitas pastas; no entanto eu escrevi alguns ajustes que tornam muito mais fácil para mim. Adicione o seguinte ao seu bashrc:

alias dirs='dirs -v'
pd () 
{ 
    if [ "$1" ]; then
        pushd "${1/#[0-9]*/+$1}";
    else
        pushd;
    fi > /dev/null
}
  • Use pd (como uma forma mais curta de pushd ) para pular para uma nova pasta, lembrando onde você estava.
  • Use dirs para ver a lista de diretórios salvos.
  • Use pd 3 para ir para o diretório número 3.

Exemplo de uso:

$ PS1='\w\$ '   ## just for demo purposes
~$ pd ~/Documents/data
~/Documents/data$ pd ../spec
~/Documents/spec$ pd ~/Dropbox/Public/
~/Dropbox/Public$ pd /tmp
/tmp$ pd /etc/defaults/
/etc/defaults$ dirs
 0  /etc/defaults
 1  /tmp
 2  ~/Dropbox/Public
 3  ~/Documents/spec
 4  ~/Documents/data
 5  ~
/etc/defaults$ pd 2
~/Dropbox/Public$ dirs
 0  ~/Dropbox/Public
 1  ~/Documents/spec
 2  ~/Documents/data
 3  ~
 4  /etc/defaults
 5  /tmp
~/Dropbox/Public$ pd 4
/etc/defaults$ dirs
 0  /etc/defaults
 1  /tmp
 2  ~/Dropbox/Public
 3  ~/Documents/spec
 4  ~/Documents/data
 5  ~
/etc/defaults$ pd 3
~/Documents/spec$ popd
~/Documents/data ~ /etc/defaults /tmp ~/Dropbox/Public
~/Documents/data$ 
    
por 08.02.2012 / 15:17
6

O seguinte pareceu funcionar no único caso em que eu testei, e você pode simplesmente colocar seus nomes de diretórios como links simbólicos em ~ / Marcadores:

mkdir "$HOME/Bookmarks"
ln -s /tmp "$HOME/Bookmarks/testdir"

function ccd() { cd $(readlink "$HOME/Bookmarks/$1") ; }

ccd testdir && echo $PWD
# gives /tmp
    
por 08.02.2012 / 08:48
6

Você poderia fazer algo pior do que tentar j2 .

A partir do README:

Spend a lot of time cd-ing around a complex directory tree?

j keeps track of where you’ve been and how much time you spend there, and provides a convenient way to jump to the directories you actually use.

Eu uso extensivamente & recomendo.

    
por 17.02.2012 / 05:48
5

Eu aconselharia usando o zsh , que é um bom complemento de TAB para diretórios, arquivos e até mesmo opções para a maioria dos programas cli .

Eu tenho usado esse shell há anos e perderia a funcionalidade se ele tivesse desaparecido. O script do zsh também é muito divertido, com um grande número de frases de efeito que podem ajudá-lo a dia.

    
por 08.02.2012 / 12:17
5

Na minha experiência, a maior aceleração na navegação em um shell é usar sua funcionalidade de pesquisa de histórico. No Bash você pode pesquisar para trás no seu histórico de comandos pressionando Ctrl + R e digitar algum padrão. Esse padrão é então comparado com entradas anteriores em seu histórico - podem ser comandos cd ou outras operações - e sugestões são feitas enquanto você digita. Basta apertar enter para executar o comando sugerido novamente. Isso é chamado de reverse-search-history no Bash e eu adoro isso. Isso me poupa de muitos toques de tecla e poupa minha memória interna.

É uma coisa boa porque você só precisa lembrar de uma parte menor de um comando, como Drop ou Wa para distinguir entre as duas entradas do histórico cd ~/Dropbox/Projects/ds/test/ e cd /Project/Warnest/docs/ .

    
por 28.02.2013 / 18:04
5

Eu também uso esses aliases (adicione-os a ~ / .bashrc):

alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'

É muito mais rápido ir para o diretório superior com eles (mas isso só resolve metade da navegação).

    
por 11.07.2014 / 20:13
4

se você estiver usando zsh:

  • você não precisa digitar cd , basta digitar o caminho do diretório ( /foo/bar/baz<Enter> é igual a cd /foo/bar/baz<Enter> )

    requer que a opção auto_cd seja definida

  • você pode expandir caminhos abreviados com Tab key ( /u/sh/pi<Tab> expande para /usr/share/pixmaps ; também funciona para nomes de arquivos)
por 08.02.2012 / 15:00
4

Existe uma ferramenta bastante interessante para alterações rápidas no diretório:

xd - trocador de diretório eXtra rápido link

um pouco estranho é que você precisa mapeá-lo no perfil do bash ou similar, já que apenas envia o

diretório

# function to do 'cd' using 'xd'
# -g turns generalized directory search command processing on
# which improves the whole thing a bit
f() 
{
        cd '/usr/bin/xd -g $*'
}

você pode fazer coisas como:

# change to /var/log/a* (gives you a list to choose from)    
f vla
# to skip the list and go directly to /var/log/apache2
f vlapach
    
por 25.03.2012 / 13:50
4

Você nunca deve digitar o caminho completo no shell de qualquer maneira. Você sempre pode usar:

soffice /P*/W*/*/mydoc*

em vez de

soffice /Project/Warnest/docs/mydoc.odt
    
por 27.05.2014 / 16:05
3

Há também OLDPWD , uma variável de ambiente que, de acordo com o IEEE 1003.1 (POSIX), deve ser atualizada com o diretório de trabalho anterior sempre que cd alterar o diretório de trabalho (para os curiosos, linha 80244 da página 2506 IEEE 1003.1-2008).

    
por 08.02.2012 / 14:12
3

Há também um aplicativo "wcd" criado especificamente para isso (também portado para o cygwin, já que estou nisso). Você pode criar atalhos, marcadores de diretórios com ele. Também suporta cartões selvagens. Lendo a man page & docs em / usr / share / wcd deve ajudar muito.

link

    
por 10.02.2012 / 05:33
3

cdargs é a ferramenta mais eficiente para marcar um diretório: link

    
por 27.02.2013 / 19:57
3

Experimente o fastcd ( link ) Ele define hook que registra diretórios visitados do bash. E define o script como "j" alias, que mostra os últimos diretórios visitados, com a capacidade de rapidamente cd (começar a digitar para filtrar diretórios). A modificação de .bashrc é necessária para criar o alias "j".

Obtendo ferramenta

cd ~; mkdir Soft; cd Soft
git clone https://github.com/frazenshtein/fastcd

Instale os módulos necessários

pip install --user urwid

Envie o arquivo set.sh para o seu bashrc

echo -e "\nsource /home/$USER/Soft/fastcd/set.sh\n" >> ~/.bashrc

E atualize o bashrc

source ~/.bashrc

Em seguida, basta digitar "j" no console

    
por 03.11.2014 / 23:38
3

Eu fiz a mesma pergunta e encontrei primeiro esta resposta . Eu instalei o utilitário z ( link ).

Isso é exatamente o que você procura, porque z aprende com seus comandos de cd e mantém o controle dos diretórios de acordo com o princípio frecency (frequente & recente). Então, depois de fazer os dois comandos cd uma vez, você pode fazer algo como:

z docs
z ds

para ir para /Project/Warnest/docs/ e ~/Dropbox/Projects/ds/test/ , respectivamente. Os argumentos para z são regexes, então você nem precisa digitar um nome completo de pasta.

    
por 11.01.2016 / 09:34
3

Atualização (2016): agora uso FASD para isso, o que permite uma pesquisa difusa baseada em seus diretórios mais recentes.

Eu criei uma ferramenta para isso, em Ruby. Ele permite que você use arquivos YAML para declarar seus projetos.

Eu escrevi um pequeno artigo sobre isso aqui: link

Também postei a fonte no GitHub: link

    
por 16.02.2015 / 19:56
2

Eu tenho usado meu próprio utilitário cdhist para gerenciar isso por muitos anos. Ele alias seu comando cd e mantém automaticamente uma pilha de diretórios.

    
por 27.05.2014 / 15:00
2

Você pode usar export para atribuir seus caminhos de diretório a variáveis e, em seguida, referenciá-los.

export dir1=/Project/Warnest/docs/
export dir2= ~/Dropbox/Projects/ds/test/
cd $dir1
cd $dir2
    
por 17.01.2017 / 16:58
1

Algumas sugestões aqui:

Idéia mais direta, adicionarei o alias no arquivo .profile

vi ~/.profile
alias dir1='cd /myhome/onedir'
alias dir2='cd /jimmy/anotherdir'

Em seguida, use $ dir1 ou dir2 , pode cd

Se você está sempre mudando em apenas dois dirs. usar cd - alternará entre eles.

    
por 29.02.2012 / 03:40
1

A solução que eu uso para essa situação é screen . Inicie a tela e crie uma janela para cada diretório com C-a c e navegue até lá. Altere entre janelas / diretórios com C-a n ou C-a p . Nomeie as janelas com C-a A . Em seguida, você pode abrir uma lista de suas janelas com C-a " e navegar usando o número da janela ou o nome. Como é screen , você pode desanexar da sessão salvando seu espaço de trabalho e anexar novamente com a mesma configuração.

    
por 28.02.2013 / 17:22
1

Eu nunca gostei de pushd e popd porque eles exigem previsão. Parafuso que, vamos apenas acompanhar os últimos vários diretórios por conta própria e, em seguida, disponibilizá-los com uma função de cd-para-old-dirs. Eu chamo de cdo . Coloque isso no seu arquivo rc (por exemplo, ~/.bashrc ):

function precmd() { __path_log; }    # to install in zsh, harmless in bash
PROMPT_COMMAND="__path_log"          # to install in bash, harmless in zsh

# Populate the array DIRHIST with the last 8 dirs visited (not for direct use)
__path_log() {
  local d dh first=true
  if [ -d "$__DIRHIST" ] && [ "$__DIRHIST" != "$PWD" ]; then
    # $__DIRHIST is the last dir we saw, but we miss foo in 'cd foo; cd bar'
    # so we use $OLDPWD to catch it; so you'd need a THIRD change to fool us.
    for d in "$__DIRHIST" "${DIRHIST[@]}"; do
      if [ -n "$first" ]; then unset DIRHIST first; DIRHIST[1]="$OLDPWD"; fi
      if [ "$OLDPWD" = "$d" ] || [ "$PWD" = "$d" ] || [ ! -d "$d" ]; then
        continue
      fi
      dh=$((1+${#DIRHIST[@]}))
      [ $dh -lt 9 ] && DIRHIST[$dh]="$d" # push up to 8 directories
    done
  elif [ -z "$__DIRHIST" ]; then
    DIRHIST[1]="$OLDPWD"
  fi
  __DIRHIST="$PWD"
}

cdo() {
  local d n=0
  if [ -z "${DIRHIST[1]}" ] || [ -z "$1" ]; then
    cd ${OLDPWD+"$OLDPWD"}
    return $?
  fi
  case "$1" in
    ls )   for d in "${DIRHIST[@]}"; do echo "$((n=n+1)) <$d>"; done \
             |sed "s:<$HOME:<~:;s:</home/:<~:" |column \
             |GREP_COLORS='ms=0;32' grep --color -e '\b[0-9] <' -e '>' ;;
    [1-9]) cd "${DIRHIST[$1]}" ;;
    * )    [ -d "$1" ] && cd "$1" || echo "Usage: cdo [NUM|ls]" >&2; return 2 ;;
  esac
}

O exemplo a seguir usa um prompt de dólar de diretório hash ( # dir $ ), escolhido porque o Stack Overflow deixará os prompts em cinza:

# ~ $ cd /tmp
# /tmp $ cdo
# ~ $ cdo ls
1 </tmp>
# ~ $ cd /
# / $ cdo ls
1 </home/adam>  2 </tmp>
# / $ cdo
# ~ $ cdo ls
1 </>   2 </tmp>
# ~ $ cdo 2
# /tmp $ cd test
# /tmp/test $ cd ../test2
# /tmp/test2 $ cdo ls
1 </tmp/test>   3 </home/adam>
2 </tmp>        4 </>
# /tmp/test2 $ cdo 4
# / $ cd
# ~ $ cdo ls
1 </>           3 </tmp/test>
2 </tmp/test2>  4 </tmp>

É realmente legal ver que outras pessoas tiveram a mesma ideia geral que eu (eu pensei que eu fosse original!). @ SamTroliman mencionou fastcd , @ null xd , e o j2 do @phildobbin parecem bastante semelhantes. Veja também pergunta duplicada 84445 , que tem uma resposta zsh usando setopt auto_pushd . Eu ainda prefiro meu próprio código, mas ymmv.

    
por 14.01.2015 / 03:33
1

Parece que o que você precisa é basicamente um arquivo de projeto para o seu fluxo de trabalho. Com diretórios que pertencem à sua atividade, como em um IDE de programação. Experimente as Zsh Navigation Tools e a ferramenta n-cd lá. Ele permitirá que você navegue pelas últimas pastas visitadas e também defina um Hotlist com os diretórios de sua escolha:

n-cdpodeserassociadoaumacombinaçãodeteclascom:

zle-Nznt-cd-widget

bindkey"^T" znt-cd-widget

    
por 07.11.2015 / 18:19
1

TL; DR

  1. Use um Fish para o shell interativo que o autoriza imediatamente ( fish > zsh > bash ).
  2. Use POSIX / Bash para script que é a sintaxe mais amplamente suportada ( POSIX > Bash > Zsh > Fish ).

Shells

Ter testado diferentes shells aqui é o meu feedback (em ordem de teste / adoção):

  • %código%:
    • preenchimento automático: básico;
    • expansão do caminho: não;
    • script: excelente.
  • Bash + Zsh :
    • preenchimento automático: bom (circulando);
    • expansão do caminho: sim ( oh-my-zshcd /e/x1 );
    • script: bom.
  • cd /etc/X11/ + Fish (atual) é o melhor da caixa:
    • preenchimento automático: opções nativas e suportadas;
    • expansão do caminho: sim;
    • scripts: muita diferença em relação ao POSIX.

Use aliases significativos

Cada shell pode ser expandido usando oh-my-fish e function , aqui estão os que eu uso relacionados ao seu problema (compatível com POSIX):

back () {  # go to previous visited directory
        cd - || exit
}

up () {  # go to parent directory
        cd ..|| exit
}

Existem coisas básicas, mas realmente significativas, tão fáceis de lembrar e de autocompletar.

Conheça o seu escudo

Configure alias para adicionar seus diretórios mais usados (por exemplo, CDPATH , ~/projects/ ) para que você possa pular rapidamente para eles.

Veja a resposta manatwork para mais detalhes sobre /etc/init.d/ .

Hangout e leia

por 20.12.2015 / 16:17