Esiste un comando per tornare indietro di una serie di passaggi in una directory, senza usare cd?


14

Vado costantemente 'cd ../../../../'. Esiste un comando / alias che potrebbe lasciarmi andare 'cmd 4' e verrei portato indietro di 4 directory?


ls? Sicuramente intendi cd?
Chris Jester-Young,

Sì, l'ho appena scritto in fretta;) Editing ora.

Lo farai ?:alias cmd5 = "cd ../../../../../"
ypercubeᵀᴹ

Beh, suppongo che potrei scriverli da 1 a 10 o giù di lì, ma sarebbe bello avere un modo intelligente di farlo. Non mi sta proprio bene. Lo farà se non emerge altra soluzione, però.

Risposte:


16

Metti questo nel tuo ~/.bashrc:

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

(Il nome cdupderiva dal comando FTP corrispondente, solo FYI.)


Grazie per la risposta, è andata con la risposta del jleedev a causa del fatto che era 1 riga più corta e non riuscivo a decidere chi scegliere! Grazie comunque!

@Muu: Entrambe le risposte funzioneranno, ma la mia funzionerà per molti, molti livelli, e @ jleedev funzionerà solo per una piccola manciata (qualunque sia il limite dello stack). ;-) (Sono sicuro che non raggiungerai mai il limite in entrambi i casi, ma il mio è più generale, è quello che sto cercando di ottenere. :-))
Chris Jester-Young,

Giusto punto, ti ho assegnato la risposta allora. Scusa jleedev - anche se molto probabilmente continuerò a usare la tua soluzione poiché dimenticherò di cambiarla :)

11

Mi è stato insegnato a usare "pushd" e "popd" per tali circostanze.

Ad esempio, digitare "pushd". e poi 'cd / home'. Ora digita "popd" e tornerai al punto di partenza.

'pushd' / 'popd' è uno stack, puoi inserire tutte le directory che vuoi, ma è l'ultima, prima di tutto quando fai il pop-up.


Uhm, carino. Non ne ho sentito parlare. Non si adatta perfettamente a quello che stavo cercando, ma lo userò anche io. Grazie.

10

Certo, perché no:

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

Bash non è ricorsivo di coda, giusto? Se lo fai, potresti impilare l'overflow up 500. :-)
Chris Jester-Young,

6
Se le tue directory sono annidate così profondamente, hai le mie simpatie.
Josh Lee,

Usato questo. Batti Chris di 1 riga;)

@Muu: non sapevo che questa domanda fosse un codice golf! ;-) A proposito, vieni, unisciti a noi! codegolf.stackexchange.com
Chris Jester-Young,

3
@Muu Ricorda che la ricorsione non è il modo corretto di scrivere script di shell in generale.
Josh Lee,

4

Veloce e sporco:

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

Formulato per cambiare directory una sola volta.


2

Ecco un modo alternativo:

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

1

Potresti voler esaminare l'utilizzo pushde popdimpostare i marcatori di posizione e tornare facilmente da qualsiasi directory in cui sei stato modificato.

Puoi anche impostare una variabile con il nome di una directory che usi molto, quindi CD lì:

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

1

Uso l' autojump che mi consente di digitare:

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

può imparare dalle tue abitudini ed è molto leggero (e avvincente;))


1

Costruisci il percorso usando printfquindi cd:

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

Usare come:

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

0

Due pensieri che potrebbero esserti utili:

  1. cd -
    torna all'ultima directory in cui ti trovavi. Lo uso sempre per andare dal profondo del mio albero di codice alla radice di esso ... anche se funziona solo se lo hai inserito in un CD modificare.

  2. cdd vecchio nuova
    questa era una funzione di script che avevo scritto in passato che ho usato per muoversi tra gli alberi simili. Fondamentalmente ha preso due argomenti e ha fatto una regexp sul tuo percorso, ottimo per muoversi tra i rami e simili. Ad esempio, se tu fossi in ~ / bzr / web / trunk / path / to / feature e avessi bisogno di arrivare a ~ / bzr / web / feature-branch / path / to / feature, lo faresti cdd trunk feature-branch. L'implementazione che avevo era in un linguaggio shell arcaico su AIX, ma era piuttosto banale, quindi dovrebbe essere facile da implementare nella shell di scelta se ne hai bisogno. Per noi è stato molto utile perché la struttura sembrava: ... / {product} / {version} / {release} / {src, bld, dbg, pkg, tst} / {component} / ... così spostarsi in quell'albero è diventato pazzo abbastanza in fretta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.