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?

studiohack
fonte
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.)

Chris Jester-Young
fonte
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.

ʍǝɥʇɐɯ
fonte
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))
}
Josh Lee
fonte
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.

Glenn Jackman
fonte
2

Aqui está uma maneira alternativa:

function cdup
{
    cd $(for ((i=0 ; i<$1 ;i++)); do printf "../" ; done)
}
jlliagre
fonte
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'
Caleb
fonte
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;))

Cédric Julien
fonte
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
bispo
fonte
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.

cabbey
fonte