Existe um comando para voltar várias etapas em um diretório, sem usar o cd?


14

Eu estou constantemente 'cd ../../../../'. Existe um comando / alias que poderia me deixar ir 'cmd 4' e eu receberia de volta 4 diretórios?


ls? Certamente você quer dizer cd?
Chris Jester-Young

Sim, eu escrevi com pressa;) Editando agora.

Wiil fazei isto ?:alias cmd5 = "cd ../../../../../"
ypercubeᵀᴹ

Bem, suponho que eu possa escrevê-los por 1 a 10 ou mais, mas seria bom ter uma maneira inteligente de fazê-lo. Isso realmente não está certo comigo. Fará isso se nenhuma outra solução surgir, no entanto.

Respostas:


16

Coloque isso no seu ~/.bashrc:

cdup() {
  levels=${1-1}
  while ((levels--)); do
    cd ..
  done
}

(O nome cdupvem do comando FTP correspondente, apenas FYI.)


Obrigado pela resposta, foi com a resposta do jleedev por ser 1 linha mais curta e eu não conseguia decidir quem escolheria! Obrigado mesmo assim!

@ Muu: Ambas as respostas funcionarão, mas as minhas funcionarão para muitos, muitos níveis, e as @ jleedev só funcionarão para um pequeno punhado (seja qual for o limite da pilha). ;-) (eu tenho certeza que você nunca vai atingir o limite de qualquer forma, mas a minha é mais geral, é o que estou tentando chegar :-).)
Chris Jester-Young

Ponto justo, eu lhe dei a resposta então. Jleedev Desculpe - embora provavelmente vou continuar a usar a sua solução como eu vou esquecer de mudá-lo :)

11

Fui ensinado a usar 'pushd' e 'popd' em tais circunstâncias.

Por exemplo, digite 'pushd'. e depois 'cd / home'. Agora digite 'popd' e você voltará para onde começou.

'pushd' / 'popd' é uma pilha, você pode enviar quantos diretórios quiser, mas é o último a ser ativado, primeiro quando você faz o pop-up.


Hum, legal. Não ouvi falar disso. Não se encaixa exatamente no que eu estava procurando, mas também o usará. Obrigado.

10

Claro, por que não:

acima() {
    [$ # = 0] && cd .. && return
    [$ 1 = 0] e retorno
    cd .. && up $ (($ 1 - 1))
}

Bash não é recursivo de cauda, ​​certo? Você pode empilhar o estouro, se o fizer up 500. :-)
Chris Jester-Young

6
Se seus diretórios estão aninhados tão profundamente, você tem minhas simpatias.
Josh Lee

Usou isso. Beat Chris por 1 linha;)

@ Muu: Eu não sabia que esta pergunta era um código de golfe! ;-) BTW, venha se juntar a nós! codegolf.stackexchange.com
Chris Jester-Young

3
@ Muu Lembre-se de que a recursão não é a maneira correta de escrever scripts de shell em geral.
Josh Lee #

4

Rapido e sujo:

cmd () { dir=.; for i in $(seq 1 $1); do dir=$dir/..; done; pushd $dir; }

Formulado para alterar o diretório apenas uma vez.


2

Aqui está uma maneira alternativa:

function cdup
{
    cd $(for ((i=0 ; i<$1 ;i++)); do printf "../" ; done)
}

1

Você pode querer usar pushde popddefinir marcadores de local e voltar para lá facilmente de qualquer diretório para o qual você mudou.

Você também pode definir uma variável com o nome de um diretório que você usa muito e, em seguida, CD lá:

MYPROJ=~/projects/name/src
cd $MYPROJ
proj1='cd $MYPROJ'

1

Eu uso o autojump, que me permite digitar:

j h
>> /home/cjulien
j et
>> /etc

pode aprender com seus hábitos e é muito leve (e viciante;))


1

Crie o caminho usando printfentão cdpara ele:

cdup() {
    local path
    printf -v path '%*s' "${1:-1}"
    cd "${path// /../}"
}

Use como:

cdup 4 # to go up four directories
cdup 1 # to explicitly go up one directory
cdup   # to implicitly go up one

0

Dois pensamentos que podem ser úteis para você:

  1. cd -
    mude de volta para o último diretório em que você estava. Eu uso isso o tempo todo para ir do fundo da minha árvore de código à raiz dela ... embora isso só funcione se você fizer o cd em uma mudança.

  2. cdd old new
    Esta foi uma função de script que eu escrevi no passado que usei para mover-me entre árvores semelhantes. Basicamente, foram necessários dois argumentos e fizeram uma regexp no seu caminho, ótimo para se movimentar entre galhos e coisas do tipo. Por exemplo, se você estivesse em ~ / bzr / web / trunk / path / to / feature e precisasse acessar ~ / bzr / web / feature-branch / path / to / feature, você faria isso cdd trunk feature-branch. A implementação que eu tinha estava em uma linguagem arcaica do shell no AIX, mas era bastante trivial, portanto, deve ser fácil de implementar no shell de sua escolha, se você precisar. Para nós, isso foi muito útil porque a estrutura parecia: ... / {product} / {version} / {release} / {src, bld, dbg, pkg, tst} / {component} / ... tão movimentada naquela árvore ficou louca bem rápido.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.