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


Atualmente, passo muitas das minhas horas de trabalho indo e voltando entre dois caminhos que estão muito abaixo da árvore e desviam um do outro na raiz. Parece-me que minha vida seria muito mais fácil se houvesse um argumento para cd que leva o usuário ao último diretório em que estavam.

Isto é, se eu estiver em:

/etc/foo/bar/baz/moo

e depois digite:

cd /var/lib/fubarred_app/blargh/logs

Eu gostaria de poder voltar ao primeiro diretório sem ter que digitar o caminho inteiro novamente.

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

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


209


origem


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


Respostas:


O comando

cd -

vai realizar a troca que você precisa 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.


o Página man do POSIX para cd menciona:

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 deverá ser alterada para o valor do diretório de trabalho antigo (que é o diretório de trabalho atual imediatamente antes da chamada para cd).

OPERANDES

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

cd "$OLDPWD" && pwd 

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


292



Tenha em mente que isso realmente depende do shell que você está usando e, como você não especificou, seria difícil dar a resposta "portátil" inexistente. - Randal Schwartz
@Randall, Talvez você possa combinar todos os seus comentários de shell individuais em uma resposta da Voltron-Shell. - hyperslug
@Randall. Eu estava usando bash. Ele funciona em ksh e zsh também. Aliás, aprendi a programar pela primeira vez a edição de 1994 Perl de Aprendizagem então me desculpe enquanto eu faço um fanboy. :) - Yitzchak
Hmm, eu usei cd $OLDPWD por esta. É bom que os shells tradicionais ofereçam uma forma mais curta. - ulidtko
@sinni Certos sabores Faz ter pushde pelo menos é um embutido bash. - slhck


Além da resposta de bryan, vale a pena mencionar que há também pushd e popd, que cria diretórios como uma pilha. Isso também está disponível no Windows NT; no entanto, não está disponível em todos os shells.

Por exemplo, podemos ir a três diretórios diferentes e você sempre verá sua pilha quando 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ê ligar popd três vezes seguidas, você 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; tem uma opção AUTO_PUSHD, que irá empurrar automaticamente cdestá na pilha.


105



O pushd e o popd não estão disponíveis em todos os shells. - Randal Schwartz
@ Wiesław: Realmente? Eu queria que o bash tivesse isso ... Claro, eu poderia pseudônimo cd para pushde seria basicamente o mesmo. - Chris Charabaruk
Ou alias pd para pushd e ter ambos. BTW pushd (ou pd, se você aliasse) por si só troca o diretório atual e o último diretório, essencialmente realizando o que 'cd -' faz. - JRobert
Eu gosto do conceito, mas nunca me acostumei com eles. - Thorbjørn Ravn Andersen


Existem alguns programas "jump"

  • autojump (mantido com recursos básicos)
  • j2  (aparentemente sem manutenção com alguns recursos avançados)
  • z (versão mantida 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 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 você deseja para 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

13



"j" é claramente específico do shell. Você não disse isso. - Randal Schwartz
@ Randal: Como é específico de shell? É um programa. - Fixee
Eu sou um idiota. :) Eu vejo agora. - Randal Schwartz


Além de cd - e cd $OLDPWD

Você pode usar a pesquisa de histórico pressionando CTRL-R e digitando algumas letras do cd comando que você digitou antes. Pressionando CTRL-R repetidamente trará partidas mais antigas.

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


10



CTRL-R não necessariamente ajuda. Você pode ter estado em / some / obscure / directory / deep e feito "cd evendeeperdir" e então foi para ~ / somehere / different. - justintime
Ótimo! Ele funciona para outras coisas cd, ótima ajuda! - Niloct


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

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

a 1

e depois:

1

9



Apenas em um shell que entende aliases e funções. Nem todos fazem. - Randal Schwartz
então isso pula digitando o alias = partes? hmmmm - Xen2050


bashmarks permite marcar uma série de pastas e alternar entre elas com a conclusão da tabulação:

Para marcar uma pasta, basta ir para essa pasta e, em seguida, marcá-lo da seguinte forma:

bookmark foo

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

go foo

Para ver uma lista dos marcadores:

bookmarksshow

Trabalhos de conclusão de tabulação, para ir ao marcador de shoobie, simplesmente:

go sho[tab]

6





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


4



No entanto, nenhum histórico compartilhado, se você usar / editar comandos anteriores regularmente (talvez uma redefinição os obtenha ...?) - Xen2050
@ Xen2050 Veja a opção de shell share_history em zsh. - Radon Rosborough


Eu sei que isso não é estritamente uma resposta à sua pergunta, mas é útil para alcançar o objetivo de levando-o aos seus diretórios importantes.

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

do meu arquivo .bashrc:

export CDPATH='.:~/source/'

CD primeiro buscas em sua pasta atual e, em seguida, pesquisa em meu diretório de projeto de codificação.

cd myproject

.. me leva para ~ / sources / myproject de onde eu estou atualmente de pé.

Pequeno recurso simples que ajudou bastante a minha navegação por diretório.


4



+1 Isso adiciona a pasta CDPATH para cdlista de autocompletar (TAB), que é boa. Mas se o . não está incluído e se houver uma pasta em uma pasta CDPATH com o mesmo nome como um em seu diretório atual, cd samename irá para o diretório CDPATH e não aquele no diretório atual, que é ruim. Tem que usar cd ./samename para entrar em uma pasta dup. - Xen2050
Sim, bom comentário. Sempre inclua o primeiro ., ou você vai experimentar coisas estranhas. - phareim