Como mover-se rapidamente de e para diretórios profundamente aninhados através da CLI? [duplicado]

15

Sabemos que usar cd <directory> abrirá o diretório, se ele existir!

Além disso, cd .. nos elevará um nível a partir do diretório de trabalho atual.

Mas, quando temos um diretório aninhado com um caminho mais longo como /home/thina/teams/td/tech/app/release/apks , é cansativo apenas ir para a pasta apks e também é difícil voltar para outro nó, digamos aqui /home/thina/teams .

Existe alguma maneira de pular a digitação de cd e cd .. ? Estou usando o Ubuntu 16.04.

    
por G SURENDAR THINA 27.06.2016 / 11:46

11 respostas

29

pushd e popd :

pushd /home/thina/teams/td/tech/app/release/apks
# current directory now /home/thina/teams/td/tech/app/release/apks
popd
# current directory now what it was before pushd command

Teste help pushd e help popd para mais opções. Não há man page, porque pushd e popd são comandos internos bash.

    
por Jos 27.06.2016 / 13:11
14

Além das ótimas respostas já fornecidas, veja algumas dicas sobre como usar cd de maneira eficaz.

  • cd - o levará de volta ao último diretório em que você estava.
  • cd ../../.. irá levá-lo até 3 níveis de uma vez, você pode usar o .. notação encadeada para 'subir' quantos diretórios você gosta.
  • Se você não tem certeza de quantas vezes deseja mover-se, use cd .. , em seguida, use bash história pressionando-se a tecla de seta para usar o comando novamente.
  • Use ~ para substituir o diretório inicial dos usuários atuais. Se você estiver logado como usuário, cd ~/teams , levará você para /home/thina/teams
  • Use o preenchimento automático de Bash para caminhos, a tecla tab completará uma seção de um caminho no comando cd , se você digitar parte de um segmento de caminho seguido por Tab , esse segmento ser completado se não houver outra opção válida. Por exemplo, se você tivesse digitado cd /home/thina/teams/td/t então pressionado Tab , a palavra tech seria preenchida para você, desde que não houvesse outros arquivos ou diretórios no diretório td que começou com a letra t.

Usar essas dicas juntas pode tornar diretórios de passagem com cd menos dolorosos.

    
por Arronical 27.06.2016 / 14:12
8

Para subir na árvore vários níveis de cada vez, você pode usar a seguinte função (graças ao muru para a versão aprimorada):

up ()
{
    local old="$PWD"
    for i in $(seq "${1:-1}"); do
        cd ..
    done
    OLDPWD="$old"
}

Então você pode fazer:

$ pwd
/home/thina/teams/td/tech/app/release/apks
$ up 5
cd'ing into /home/thina/teams

Além disso:

  • chamar up sem um argumento equivale a cd .. devido a ${1:-1} , que substitui quando definido e 1 de outra forma
  • definir OLDPWD após o último cd .. tem como objetivo preservar o comportamento usual de cd - .
por user149018 27.06.2016 / 15:46
6

Para nomes de diretórios longos, use variáveis com caminho completo. Por exemplo,

APKS="/home/thina/teams/td/tech/app/release/apks"

Então você pode fazer apenas cd "$APKS"

Quanto a aumentar x número de diretórios, tenho essa função definida no meu .bashrc

goup() # go up x number of dirs
{
  num=
  while [ $num -ne 0  ];do
    cd ..
    num=$( expr $num - 1   )
  done
}

Para retornar a /home/thina/teams de apks você faria

goup  6

Veja um exemplo de uso:

$> pwd
/sys/class/backlight/intel_backlight
$> goup 3
$> pwd
/sys
$> 

Outra pequena função que eu criei, mas nunca usei muito, é a função bookmark .

Veja como funciona: ele salva sua pasta atual em algum arquivo e, em seguida, você pode criar um cd para um diretório específico com base no número da linha nesse arquivo. Exemplo:

$> cd /etc/lightdm
$> bookmark
$> cat ~/.dirsbookmarks                                                                                                  
/home/xieerqi
/sys/class/backlight
/etc/lightdm
$> cd $( awk 'NR==2' ~/.dirsbookmarks  )                                                                                 
$> pwd
/sys/class/backlight

E aqui está a função em si:

bookmark()
{ # bookmarks current dir
  pwd >> $HOME/.dirsbookmarks
}
    
por Sergiy Kolodyazhnyy 27.06.2016 / 11:54
3

Aliases

Eu tenho uma lista de diretórios usados com freqüência diretamente disponíveis via alias. Isso também inclui atalhos para os diretórios na hierarquia.

alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'
alias cdwork=/home/knub/Repositories/work
alias cduni=/home/knub/University

Agora, quando quero subir três níveis, apenas digito ....<Enter> e lá estou eu!

    
por knub 28.06.2016 / 13:34
3

Ative a autocd opção ( shopt -s autocd ), para que você não precise digitar cd . Por exemplo, você só precisa do comando de dois caracteres .. para ir para o diretório pai.

Se você estiver navegando entre dois diretórios, poderá alternar entre eles com cd - , que vai para o diretório de trabalho anterior. A opção autocd não faz - run cd - , mas você pode definir um alias ou uma função para isso.

Você pode memorizar diretórios em uma pilha com os recursos internos pushd e popd . O builtin dirs lista a pilha de diretórios (eu encontro dirs -v mais legível).

Se você mudar frequentemente para subdiretórios de um diretório específico, e esses subdiretórios tiverem um nome único, adicione-os ao CDPATH variável. No entanto, esteja avisado que nunca encontrei uma situação em que CDPATH fosse realmente útil.

Você pode definir uma variável como um nome de diretório e, em seguida, alterar para ela com $foo .

Zsh tem alguns recursos interessantes que o bash não possui. Alguns deles podem ser emulados por funções de escrita que fazem o mesmo trabalho. Em particular, a forma de dois argumentos de cd permite que você mude convenientemente para outro diretório com um nome semelhante, por exemplo, de /home/thina/teams/td/tech/app/release/apks/com.acme/v1 , a execução de cd release beta vai para /home/thina/teams/td/tech/app/beta/apks/com.acme/v1 .

    
por Gilles 29.06.2016 / 00:43
2

Como já atendi em um no UnixSE, eu uso um script chamado z [github] para isso.

Ele lembra os diretórios para os quais você clicou, classifica-os de acordo com a frequência (frequência + recência) e permite que você mude para um dos caminhos lembrados usando alguma parte de seu nome.

Depois de ter cd'ed para um diretório, pelo menos, uma vez que você pode fazer, por exemplo, em vez de:

$ cd ~user/very/long/path/with/many/subfolders/

Basta fazer:

$ z sub

que funcionará, usando correspondência parcial de nomes (supondo que você não tenha outro diretório contendo em seu caminho o termo sub e que tenha uma maior freqüência).

Eu também defini uma função como essa, que primeiro tenta um cd normal e, se falhar, usa z:

function cd() {
    builtin cd "" 2> /dev/null || z "" || (echo "cd: File or Directory not found: " >&2 && exit 1)
}

Isso lhe dá o melhor de ambos. Se a pasta estiver no diretório atual ou for dado um caminho completo válido, ela irá apenas cd lá, mas se não, ele tentará encontrar uma correspondência no banco de dados e cd lá. Isso tira a (pequena) dor de algumas vezes ter que usar cd (para treinar o banco de dados, indo para uma pasta que você nunca esteve antes) e às vezes lembrando de usar z, quando aplicável.

    
por Graipher 27.06.2016 / 18:20
2

ATUALIZAÇÃO: existe uma ferramenta ainda mais poderosa do que autojump : fasd , mas Eu não estou familiarizado com isso.

Estou surpreso que ninguém tenha mencionado autojump ainda que

  

funciona mantendo um banco de dados dos diretórios que você mais usa na linha de comando (os diretórios devem ser visitados primeiro antes que possam ser saltados para.)

É basicamente o que o @graipher construiu, com algumas opções extras.

Como eu tenho mencionado em outra pergunta:

Após você gravar algumas vezes em um diretório (mesmo que seja suficiente):

cd /home/thina/teams/td/tech/app/release/apks

você pode usar o atalho j para ir para lá rapidamente, independentemente do diretório em que você está:

j apks

Observe que o uso de qualquer parte do caminho funciona, desde que seja o mais alto da lista: j app também levará você para .../apks se você for lá mais vezes do que para .../app .

Eu o recomendaria em vez de ter seu próprio script, pois ele é bem mantido, distribuído para o Ubuntu e tem outros recursos interessantes, como pular para o filho :

.../td/tech $ jc apk
.../release/apks $ 

Move você para apks em td , em vez de outros apks em uma árvore diferente.

    
por Ciprian Tomoiagă 28.06.2016 / 03:00
1

Mais três opções que eu acho que funcionam bem (embora eu possa no futuro usar pushd mais, eu só aprendi sobre isso):

  • Organize seus caminhos para que você não precise cd em diretórios profundamente aninhados, ou melhor: para que os locais que você precisa visitar estejam sempre ao alcance dos seus dedos. A maneira de conseguir isso é com links simbólicos : mantenha os diretórios explícitos e bem hierarquizados como estão, mas faça um link de acesso rápido para sua própria conveniência.

    ln -s ~/teams/td/tech/app/release/apks ~/apks
    

    Em seguida, em vez de digitar o caminho longo até cd , use apenas cd ~/apks e cd ../teams (ou, nesse exemplo, preferível, ~/teams ) para voltar.

  • Não use um único shell e faça cd entre os caminhos, mas mantenha um shell em execução para cada um dos caminhos em que você precisa trabalhar. Existem vários níveis nos quais você pode conseguir essa multitarefa:

    • Use várias janelas de terminal. Funciona melhor se as janelas estiverem em diferentes áreas de trabalho .
    • Use várias guias em uma única janela. Isso é particularmente adequado para apenas fazer alguns comandos em algum diretório: para voltar, basta fechar a guia do terminal!
    • (Não é realmente sensato, mas para completar :) use um multiplexador de terminal como tmux .
    • Basta iniciar uma ação em um comando de finalidade única que cd s na pasta, faz uma coisa e imediatamente devolve o controle na pasta original: em vez de

      $ cd /home/thina/teams/td/tech/app/release/apks
      $ some_command this_file_here
      $ cd ../../../../..
      

      simplesmente faça o one-liner

      $ (cd ~/teams/td/tech/app/release/apks; some_command this_file_here)
      

      ou equivalentemente

      $ sh -c 'cd ~/teams/td/tech/app/release/apks
      > some_command this_file_here'
      
  • Não cd , , mas simplesmente execute o comando diretamente do seu diretório pessoal. Expansões de chaves podem ajudar muito aqui: em vez de

    $ cd /home/thina/teams/td/tech/app/release/apks
    $ some_command this_file_here other_file_also_apks
    $ cd ../../../../..
    

    você pode fazer

    $ some_command ~/teams/td/tech/app/release/apks/{this_file_here,other_file_also_apks}
    
por leftaroundabout 27.06.2016 / 16:16
0

Pushd e Popd

Os comandos pushd e popd são os meus favoritos. O comando pushd lembrará dos diretórios que você visitou, visível com o comando dirs e, quando estiver pronto para retroceder, use popd para retornar.

Veja um exemplo usando funções e aliases bash:

sd ()
{
    pushd "" > /dev/null
}

po ()
{
    popd
}

alias d='dirs'

Eu constantemente uso uma mistura desses comandos de várias maneiras.

Aliases

Outra opção para diretórios acessados com freqüência é simplesmente aliasar os comandos cd ou pushd . Então, usando os exemplos da sua postagem:

alias cdapks='cd /home/thina/teams/td/tech/app/release/apks'
alias cdteams='cd /home/thina/teams'

Combinação

Combine as duas ideias e você pode até ter isso:

alias sdapks='sd /home/thina/teams/td/tech/app/release/apks'
alias sdteams='sd /home/thina/teams'

O que lhe dá muita flexibilidade na passagem de diretórios. Eu mantenho as aliases cd*** e sd*** disponíveis para itens como Desktop , Documents , Music , Downloads etc. e é muito útil!

    
por tniles09 27.06.2016 / 22:51
0

o peixe tem várias instalações agradáveis para se movimentar rapidamente.

  • Se você digitar c d seta para a direita, ele repetirá o cd mais recente.
  • Ao usar c d seta para cima, seta para a direita, insere o segundo cd mais recente.
  • Etc.
  • Tem prevd e nextd, que geralmente são mais fáceis de usar do que o pushd e o popd.

Além disso, mantenho meus diretórios favoritos com links simbólicos para ~ / f, então eu posso cd ~ / f / x para chegar a ~ / foo / bar / baz / dados experimentais.

    
por Theodore Norvell 28.06.2016 / 23:34