Come posso passare alla directory precedente invece di salire?


214

Attualmente trascorro molte delle mie ore lavorative spostandomi avanti e indietro tra due percorsi che sono molto lontani dall'albero e si spostano l'uno dall'altro alla radice. Mi sembra che la mia vita sarebbe molto più semplice se ci fosse un argomento cdche porta l'utente all'ultima directory in cui si trovavano.

Cioè, se ci sono:

/etc/foo/bar/baz/moo

e quindi digitare:

cd /var/lib/fubarred_app/blargh/logs

Vorrei poter tornare alla prima directory senza dover digitare nuovamente l'intero percorso.

La chiave di memoria non la taglia poiché uso abbastanza comandi in ogni punto che è altrettanto difficile tornare indietro e trovare il percorso che desidero come è digitarlo da solo.

C'è un breve comando che mi lascerebbe andare alla directory precedente?


8
oltre all'eccellente risposta di @ bryan , potresti prendere in considerazione la creazione di una coppia di alias per ogni percorso in modo da poter digitare qualcosa come: " bazmoo" o " blarghlog" al prompt :)
warren,

4
Perché non usi semplicemente lo schermo GNU ?
Shi,

2
Quale shell? quello fa una differenza enorme.
Randal Schwartz,

@warren idem. questo è il mio modo preferito di fare tutto. la metà di quello per cui uso il mio computer ora ha un proprio alias ... =)
ixtmixilix

Fasd è fantastico. Controlla.
majkinetor

Risposte:


301

Il comando

cd -

eseguirà lo swap di cui hai bisogno sulla maggior parte delle shell tradizionali, la variante più vecchia è

cd "$OLDPWD"

che utilizzerà la variabile di ambiente che contiene la directory di lavoro precedente.


La pagina man POSIX percd menzioni:

DESCRIZIONE

Se, durante l'esecuzione dei passaggi precedenti, viene modificata la variabile di ambiente PWD, anche la variabile di ambiente OLDPWD deve essere modificata nel valore della vecchia directory di lavoro (ovvero la directory di lavoro corrente immediatamente prima della chiamata a cd).

OPERANDI

  -   Quando un trattino viene utilizzato come operando, questo deve essere equivalente al comando:

cd "$OLDPWD" && pwd 

che passa alla directory di lavoro precedente e quindi scrive il suo nome.


7
Tieni presente che questo dipende davvero dalla shell che stai utilizzando e, dal momento che non hai specificato, sarebbe difficile dare la risposta "portatile" inesistente.
Randal Schwartz,

16
@ Richiamo, forse potresti combinare tutti i tuoi singoli commenti di shell in una risposta Voltron-Shell.
hyperslug,

@Randall. Stavo usando bash. Funziona anche in ksh e zsh. A proposito, ho imparato per la prima volta a programmare dall'edizione 1994 di Learning Perl, quindi mi scusi un po 'come un fan. :)
Yitzchak,

Hmm, l'ho usato cd $OLDPWDper questo. È bello che le shell tradizionali offrano una forma molto più breve.
Ulidtko,

2
@sinni Certi sapori fare avere pushd, e almeno si tratta di un incorporato in bash.
slhck,

105

Oltre alla risposta di Bryan, vale la pena ricordare che c'è anche pushde popd, che costruisce directory come una pila. Questo è disponibile anche su Windows NT; tuttavia, non è disponibile in tutte le shell.

Ad esempio, possiamo andare in tre diverse directory e vedrai sempre il tuo stack quando chiami pushd:

charon:~ werner$ pushd Documents/
~/Documents ~

charon:Documents werner$ pushd ../Movies/
~/Movies ~/Documents ~

charon:Movies werner$ pushd ../Downloads/
~/Downloads ~/Movies ~/Documents ~

E quando chiamate popdtre volte di seguito, arrivate a quelle directory nello stack in ordine inverso. Allo stesso tempo, lo stack verrà svuotato di nuovo.

charon:Downloads werner$ popd
~/Movies ~/Documents ~

charon:Movies werner$ popd
~/Documents ~

charon:Documents werner$ popd
~

charon:~ werner$ popd
-bash: popd: directory stack empty

Se stai usando Zsh; ha un'opzione AUTO_PUSHD, che spingerà automaticamente cdnello stack.


pushd e popd non sono disponibili in tutte le shell.
Randal Schwartz,

5
@ Wiesław: Davvero? Vorrei che Bash lo avesse ... Certo, avrei potuto cdfarlo alias pushd, e sarebbe stato quasi sempre lo stesso.
Chris Charabaruk,

3
O alias pd per pushd e avere entrambi. BTW pushd (o pd, se lo si alias) da solo scambia la directory corrente e la directory dell'ultimo push, realizzando essenzialmente ciò che fa "cd -".
JRobert,

Mi piace il concetto ma non mi sono mai abituato.
Thorbjørn Ravn Andersen,

13

Ci sono alcuni programmi "jump"

  • autojump (gestito con funzionalità di base)
  • j2 (apparentemente non mantenuto con alcune funzionalità avanzate)
  • z (versione mantenuta di "j" con funzionalità avanzate)

Questi facilitano qualsiasi tipo di navigazione nella directory. Lo usi dando una parte del percorso e funziona.

Nel tuo caso

~$ j baz 
/etc/foo/bar/baz/moo$

~$ j bla 
/var/lib/fubarred_app/blargh/logs$

Puoi assegnare qualsiasi lettera tu voglia a questi programmi, "j" è tradizione :)

j2 e z supportano più termini di ricerca, ...

~$ j baz src
/home/me/projects/baz/repository/trunk/src$

... e altre opzioni.

~$ 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

2
"j" è chiaramente specifico della shell. Non l'hai detto.
Randal Schwartz,

3
@Randal: come è specifico per la shell? È un programma.
Fixee,

3
Sono un idiota. :) Ora lo vedo.
Randal Schwartz,

10

Oltre a cd -ecd $OLDPWD

È possibile utilizzare la ricerca della cronologia premendo CTRL-Re digitando alcune lettere del cdcomando immesso in precedenza. Premendo CTRL-Rripetutamente verranno visualizzate le partite più vecchie.

Questo metodo sarà più utile se hai più di due percorsi da cambiare.


1
CTRL-R non aiuterà necessariamente. Potresti essere stato in / some / obscure / directory / deep e aver fatto "cd evendeeperdir" quindi andare su ~ / somehere / different.
justintime,

1
Grande! Funziona per altre cose oltre a cd, un grande aiuto!
Niloct,

9

Puoi usarlo per creare facilmente alias per le directory:

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

a 1

e più tardi:

1

1
Solo su una shell che comprende alias e funzioni. Non tutti lo fanno.
Randal Schwartz,

quindi questo salta digitando le alias =parti? hmmmm
Xen2050

6

bashmarks ti permetterà di aggiungere una serie di cartelle ai segnalibri e saltare tra loro con il completamento della scheda:

Per aggiungere una cartella ai segnalibri, basta andare su quella cartella, quindi aggiungerla ai segnalibri in questo modo:

bookmark foo

Il segnalibro si chiamerà "pippo". Quando vuoi tornare a quella cartella usa:

go foo

Per visualizzare un elenco dei segnalibri:

bookmarksshow

Il completamento della scheda funziona, per andare al segnalibro shoobie, semplicemente:

go sho[tab]

4

Un'altra possibilità sarebbe quella di mantenere aperte due finestre, con una posizionata in ciascuna directory.


Nessuna cronologia condivisa, tuttavia, se si utilizzano / modificano regolarmente i comandi precedenti (forse un ripristino li avrebbe ...?)
Xen2050

@ Xen2050 Vedi l'opzione shell share_historyin zsh.
Radon Rosborough,

4

So che questa non è una risposta rigorosa alla tua domanda, ma è utile per raggiungere l'obiettivo di portarti nelle tue directory importanti .

in qualsiasi discesa UNIX-bash puoi usare CDPATH per estendere la cartella in cui cerca il comando cd.

dal mio file .bashrc:

export CDPATH='.:~/source/'

cd cerca prima nella tua cartella attuale, poi cerca nella mia directory-project-coding.

cd myproject

.. mi porta a ~ / sources / myproject da dove mi trovo attualmente.

Piccola funzione semplice che mi ha aiutato molto nella navigazione delle mie directory.


1
+1 Questo aggiunge la cartella CDPATH all'elenco di cdcompletamento automatico (TAB), che è buono. Ma se .non è incluso e se c'è una cartella in una cartella CDPATH con lo stesso nome di quella nella directory corrente, cd samenameandrà alla directory CDPATH e non a quella nella directory corrente, che è errata . Devono usare cd ./samenameper entrare in una cartella dup.
Xen2050

Sì, buon commento. Includi sempre il primo . o sperimenterai cose strane.
Phareim

3

Sì, cd -è la strada da percorrere ma mi preoccupo per la mancanza di potere che hai nel tuo guscio. popde pushdsono anche buoni, e anche quella jcosa sembra buona.

Getterò la mia utilità sul ring ... è solo qualcosa che ho costruito, personalizzato e migrato con me negli ultimi 10 anni circa e funziona perfettamente per quello che voglio che faccia.

Post di blog per la mia utility di gestione delle directory

Se funziona per te, allora fantastico, ma se non lo promette allora otterrai qualcos'altro :) Semplicemente non puoi vivere da cdsolo.


3

Se hai solo 2 directory, il modo più semplice è, come detto,

cd -

Quando ho avuto cose del genere in passato, ho avuto un paio di trucchi che ho fatto, che potrebbero essere utili.

  1. Inserisci i comandi alias nel file .cshrc, qualcosa del genere

    alias moo /etc/foo/bar/baz/moo  
    alias logs cd /var/lib/fubarred_app/blargh/logs
    
  2. Collegamento di collegamenti ai percorsi di interesse dalla mia home directory. Questa è una cosa sola.

    cd ~
    ln -s /var/lib/fubarred_app/blargh/logs blargh
    ln -s /etc/foo/bar/baz/moo
    

Ciò consentirebbe di modificare una directory in modo semplice come:

   cd ~/moo
   cd ~/blargh

2

Autojump è un comando "cd" bash / sh / zsh che dalle tue azioni vede questo video .

quindi questo ti sposterebbe a muggire dopo aver appreso le ultime cartelle

j moo

2

fascio

Ho il mio strumento, ma darò un'occhiata anche allo strumento Dereks j.

Naturalmente la prima scelta per saltare avanti e indietro è

cd -

Il mio strumento è pensato per le directory con nomi univoci sui sistemi, dove locateè disponibile; cerca un nome di directory corrispondente e passa alla prima corrispondenza:

beam () 
{ 
    ldir=$(locate $1 | egrep "$1$" | head -n 1);
    if [[ -d $ldir ]]; then
        echo $ldir;
        cd $ldir;
    else
        echo "no directory "$ldir;
    fi
}

dipendenze:

  • individuare
  • grep
  • testa

svantaggi:

  • non sono state trovate directory più recenti dell'ultima esecuzione aggiornata
  • se più di una directory corrisponde, dipende dalla tua fortuna, se sei indirizzato a quello che avevi in ​​mente.

Miglioramenti / modifiche:

  • invece di scegliere la prima directory, il codice può essere modificato per visualizzare un elenco di scelte, spingendo l'utente a inserire 1,2,3, ... per andare su / bin, / usr / bin, / usr / local / bin ...

Uso:

  • inserisci la funzione in /etc/bash.bashrc o ~ / .bashprofile, per usarla in modo conveniente.

Vantaggio della mia soluzione:

  • non limitato a 2 directory, come cd -
  • non è necessario visitare le directory una volta, prima di utilizzare la trave.
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.