Como posso mudar para o diretório anterior em vez de subir?

214

Atualmente, passo muitas horas de trabalho movendo-me para frente e para trás entre dois caminhos muito distantes da árvore e desviando um do outro na raiz. Parece-me que minha vida seria muito mais fácil se houvesse um argumento cdque levasse o usuário ao último diretório em que ele estava.

Ou seja, se eu estiver em:

/etc/foo/bar/baz/moo

e digite:

cd /var/lib/fubarred_app/blargh/logs

Gostaria de poder voltar ao primeiro diretório sem precisar digitar o caminho inteiro novamente.

A chave de memória não a corta, uma vez que eu uso comandos suficientes em cada lugar, e é tão difícil voltar e encontrar o caminho que desejo quanto digitar eu mesmo.

Existe um comando curto que me permitiria ir para o diretório anterior?

Yitzchak
fonte
8
além @ bryan excelente resposta 's, você pode considerar a criação de um par de aliases para cada caminho para que você pode simplesmente digitar algo como: ' bazmoo' ou ' blarghlog' no prompt :)
Warren
4
Por que você não usa apenas a tela GNU ?
Shi
2
Qual shell? isso faz uma enorme diferença.
Randal Schwartz
@warren ditto. essa é a minha maneira preferida de fazer tudo. metade do que eu uso meu computador para tem o seu próprio alias agora ... =)
ixtmixilix
Fasd é incrível. Confira.
majkinetor

Respostas:

301

O comando

cd -

realizar a troca necessária na maioria dos shells convencionais, a variante mais antiga é

cd "$OLDPWD"

que usará a variável de ambiente que contém o diretório de trabalho anterior.


A página do manual POSIX paracd menções:

DESCRIÇÃO

Se, durante a execução das etapas acima, a variável de ambiente PWD for alterada, a variável de ambiente OLDPWD também será alterada para o valor do diretório de trabalho antigo (que é o diretório de trabalho atual imediatamente antes da chamada para cd).

OPERANDO

  -   Quando um hífen é usado como operando, isso deve ser equivalente ao comando:

cd "$OLDPWD" && pwd 

que muda para o diretório de trabalho anterior e depois escreve seu nome.

bryan
fonte
7
Lembre-se de que isso realmente depende do shell que você está usando e, como você não especificou, seria difícil fornecer a resposta "portátil" inexistente.
Randal Schwartz
16
@ Randall, talvez você possa combinar todos os seus comentários individuais do shell em uma resposta da Voltron-Shell.
hyperslug
@Randall. Eu estava usando o bash. Também funciona em ksh e zsh. A propósito, eu aprendi a programar a partir da edição de 1994 do Learning Perl, então me desculpe enquanto eu fanboy um pouco. :)
Yitzchak
Hmm, eu usei cd $OLDPWDpara isso. É bom que os reservatórios convencionais ofereçam uma forma bem mais curta.
ulidtko
2
@sinni Certos sabores fazer tem pushd, e pelo menos é um embutido no bash.
slhck 24/08
105

Além da resposta de bryan, vale mencionar que também existem pushde popdque constroem diretórios como uma pilha. Isso também está disponível no Windows NT; no entanto, não está disponível em todas as conchas.

Por exemplo, podemos ir para três diretórios diferentes, e você sempre verá sua pilha ao ligar pushd:

charon:~ werner$ pushd Documents/
~/Documents ~

charon:Documents werner$ pushd ../Movies/
~/Movies ~/Documents ~

charon:Movies werner$ pushd ../Downloads/
~/Downloads ~/Movies ~/Documents ~

E quando você liga popdtrês vezes seguidas, chega a esses diretórios na pilha na ordem inversa. Ao mesmo tempo, a pilha será esvaziada novamente.

charon:Downloads werner$ popd
~/Movies ~/Documents ~

charon:Movies werner$ popd
~/Documents ~

charon:Documents werner$ popd
~

charon:~ werner$ popd
-bash: popd: directory stack empty

Se você estiver usando o Zsh; possui uma opção AUTO_PUSHD, que automaticamente pressiona cda pilha.

slhck
fonte
pushd e popd não estão disponíveis em todos os shells.
Randal Schwartz
5
@ Wiesław: Sério? Desejo festa teve que ... Claro, eu poderia apelido cdpara pushd, e tinha na sua maioria ser o mesmo.
Chris Charabaruk
3
Ou pseudônimo pd para pushd e ter ambos. O BTW pushd (ou pd, se você o alias), por si só, troca o diretório atual e o último diretório empurrado, realizando essencialmente o que 'cd -' faz.
JRobert
Eu gosto do conceito, mas nunca me acostumei a eles.
Thorbjørn Ravn Andersen
13

Existem alguns programas de "salto"

  • autojump (mantido com recursos básicos)
  • j2 (aparentemente sem manutenção com alguns recursos avançados)
  • z (versão atualizada de "j" com recursos avançados)

Isso facilita qualquer tipo de navegação no diretório. Você o usa dando uma parte do caminho e ele simplesmente funciona.

No seu caso

~$ j baz 
/etc/foo/bar/baz/moo$

~$ j bla 
/var/lib/fubarred_app/blargh/logs$

Você pode atribuir qualquer letra que desejar a esses programas, "j" é tradição :)

j2 e z suportam vários termos de pesquisa, ...

~$ j baz src
/home/me/projects/baz/repository/trunk/src$

... e mais opções.

~$ j -l  # list directories by "frecency"(frequency + recency) score
~$ j -r PATTERN # match by rank only, not recency
~$ j -t PATTERN # match by recency only, not rank
hayalci
fonte
2
"j" é claramente específico do shell. Você não disse isso.
Randal Schwartz
3
@Randal: Como é específico do shell? É um programa.
Fixee
3
Eu sou um idiota. :) Eu vejo agora.
Randal Schwartz
10

Além de cd -ecd $OLDPWD

Você pode usar a pesquisa de histórico pressionando CTRL-Re digitando algumas letras do cdcomando digitado anteriormente. Pressionar CTRL-Rrepetidamente trará correspondências mais antigas.

Este método será mais útil se você tiver mais de dois caminhos para alterar.

musa
fonte
1
CTRL-R não necessariamente ajuda. Você pode ter estado em / some / obscure / directory / deep e feito "cd evendeeperdir" e depois foi para ~ / somehere / different.
justintime
1
Ótimo! Funciona para outras coisas além de cd, grande ajuda!
Niloct 19/08/11
9

Você pode usar isso para criar facilmente aliases para diretórios:

a() { alias $1=cd\ $PWD; }

a 1

e depois:

1
Mr Example
fonte
1
Somente em um shell que entende aliases e funções. Nem todos fazem.
Randal Schwartz
então isso pula digitando as alias =partes? hmmmm
Xen2050
6

o bashmarks permite marcar uma série de pastas e saltar entre elas com a conclusão da guia:

Para marcar uma pasta como favorita, basta ir para essa pasta e marcar da seguinte maneira:

bookmark foo

O marcador será nomeado "foo". Quando você quiser voltar para essa pasta, use:

go foo

Para ver uma lista dos favoritos:

bookmarksshow

A conclusão da guia funciona, para ir para o marcador shoobie, simplesmente:

go sho[tab]
Faz-tudo5
fonte
4

Outra possibilidade seria manter apenas duas janelas abertas, com uma posicionada em cada diretório.

Alger
fonte
Sem história em comum, porém, se você usar / editar comandos anteriores regularmente (talvez uma redefinição iria buscá-los ...?)
Xen2050
@ Xen2050 Veja a opção de shell share_historyno zsh.
Radon Rosborough
4

Sei que isso não é uma resposta estrita à sua pergunta, mas é útil para atingir o objetivo de levá-lo aos seus diretórios importantes .

em qualquer descida do UNIX-bash, você pode usar o CDPATH para estender a pasta em que o comando cd procura.

do meu arquivo .bashrc:

export CDPATH='.:~/source/'

O cd pesquisa primeiro na sua pasta atual e depois no meu diretório de projeto de codificação.

cd myproject

.. me leva a ~ / sources / myproject de onde eu estou atualmente.

Um pequeno recurso simples que ajudou muito a minha navegação por diretório.

phareim
fonte
1
+1 Isso adiciona a pasta CDPATH à cdlista de preenchimento automático (TAB), que é boa. Mas se o .item não estiver incluído e se houver uma pasta em uma pasta CDPATH com o mesmo nome que uma no diretório atual, ela cd samenameserá direcionada para o diretório CDPATH e não para a pasta atual, que é Má. Tem que usar cd ./samenamepara entrar em uma pasta dup.
Xen2050 07/07
Sim, bom comentário. Sempre inclua o primeiro . , ou você experimentará coisas estranhas.
Phareim
3

Sim, cd -é o caminho a percorrer, mas eu me preocupo com a falta de energia que você tem na sua concha. popde pushdtambém são boas, e isso jtambém parece bom.

Vou jogar meu próprio utilitário no ringue ... é apenas algo que eu venho construindo, personalizando e migrando comigo nos últimos 10 anos ou mais, e funciona muito bem para o que eu quero que ele faça.

Postagem no blog para o meu utilitário de gerenciamento de diretório

Se funcionar para você, então incrível, mas se não funcionar, prometa-me que terá outra coisa :) Você simplesmente não pode viver cdsozinho.

Derek Wyatt
fonte
3

Se você tiver apenas 2 diretórios, a maneira mais fácil é, como mencionado,

cd -

Quando tive essas coisas no passado, tive alguns truques que já fiz, que podem ser úteis.

  1. Coloque comandos de alias no arquivo .cshrc, algo como isto

    alias moo /etc/foo/bar/baz/moo  
    alias logs cd /var/lib/fubarred_app/blargh/logs
    
  2. Vincular atalhos aos caminhos de interesse do meu diretório pessoal. Isso é uma coisa única.

    cd ~
    ln -s /var/lib/fubarred_app/blargh/logs blargh
    ln -s /etc/foo/bar/baz/moo
    

Isso permitiria alterar um diretório tão fácil quanto:

   cd ~/moo
   cd ~/blargh
PearsonArtPhoto
fonte
2

Autojump é um comando "cd" do bash / sh / zsh que, a partir de suas ações, veja este vídeo .

então isso levaria você a se lamentar depois de ter aprendido as últimas pastas

j moo
oluies
fonte
2

viga

Eu tenho minha própria ferramenta, mas também darei uma olhada na ferramenta Dereks j.

Claro que a primeira opção para pular de um lado para o outro é

cd -

Minha ferramenta é destinada a diretórios com nomes exclusivos nos sistemas, quando locatedisponível; ele procura um nome de diretório correspondente e salta para a primeira correspondência:

beam () 
{ 
    ldir=$(locate $1 | egrep "$1$" | head -n 1);
    if [[ -d $ldir ]]; then
        echo $ldir;
        cd $ldir;
    else
        echo "no directory "$ldir;
    fi
}

Dependências:

  • localizar
  • grep
  • cabeça

Desvantagens:

  • diretórios mais recentes que o último b-run atualizado não foram encontrados
  • se mais de um diretório corresponder, isso dependerá da sua sorte, independentemente de você ser direcionado para o que tinha em mente.

Melhorias / modificações:

  • em vez de escolher o primeiro diretório, o código pode ser modificado para exibir uma lista de opções, solicitando que o usuário insira 1,2,3, ... para acessar / bin, / usr / bin, / usr / local / bin ...

Uso:

  • coloque a função em /etc/bash.bashrc ou ~ / .bashprofile, para usá-la de maneira conveniente.

Vantagem da minha solução:

  • não limitado a 2 diretórios, como cd -
  • você não precisa visitar os diretórios uma vez antes de usar o feixe.
Usuário desconhecido
fonte