Wie kann ich zum vorherigen Verzeichnis wechseln, anstatt zu gehen?


209

Momentan verbringe ich einen großen Teil meiner Arbeitszeit damit, mich zwischen zwei Pfaden hin und her zu bewegen, die sich sehr weit unten im Baum befinden und an der Wurzel voneinander abweichen. Es fällt mir auf, dass mein Leben viel einfacher wäre, wenn es ein Argument dafür gäbe cd Damit gelangt der Benutzer zum letzten Verzeichnis, in dem er sich befand.

Das heißt, wenn ich in bin:

/etc/foo/bar/baz/moo

und tippe dann:

cd /var/lib/fubarred_app/blargh/logs

Ich möchte in der Lage sein, zum ersten Verzeichnis zurückzukehren, ohne den gesamten Pfad erneut eingeben zu müssen.

Die Memory-Taste schneidet nicht ab, da ich an jeder Stelle so viele Befehle verwende, dass es genauso schwierig ist, zurückzukehren und den gewünschten Pfad zu finden, wie es ist, ihn selbst einzugeben.

Gibt es einen kurzen Befehl, mit dem ich zum vorherigen Verzeichnis wechseln kann?


8
zusätzlich zu @ bryan Als hervorragende Antwort können Sie ein Paar Aliase für jeden Pfad erstellen, sodass Sie einfach Folgendes eingeben können: " bazmoo " oder " blarghlog "an der Eingabeaufforderung :)
warren

4
Warum benutzt du nicht einfach GNU-Bildschirm ?
Shi

2
Welche Schale? Das macht einen großen Unterschied.
Randal Schwartz

@ Warren dito. Das ist mein bevorzugter Weg, um alles zu tun. Die Hälfte von dem, wofür ich meinen Computer benutze, hat jetzt einen eigenen Alias ​​... =)
ixtmixilix

Fasd ist großartig. Hör zu.
majkinetor

Antworten:


293

Der Befehl

cd -

Für die meisten Mainstream-Shells wird der benötigte Swap ausgeführt, für die ältere längere Variante

cd "$OLDPWD"

Hier wird die Umgebungsvariable verwendet, die das vorherige Arbeitsverzeichnis enthält.


Das POSIX-Manpage für cd Erwähnungen:

BESCHREIBUNG

Wenn während der Ausführung der obigen Schritte die PWD-Umgebungsvariable geändert wird, wird auch die OLDPWD-Umgebungsvariable auf den Wert des alten Arbeitsverzeichnisses (dh des aktuellen Arbeitsverzeichnisses unmittelbar vor dem Aufruf von cd) geändert.

OPERANDEN

- Wenn ein Bindestrich als Operand verwendet wird, muss dies dem folgenden Befehl entsprechen:

cd "$OLDPWD" && pwd 

Das ändert sich in das vorherige Arbeitsverzeichnis und schreibt dann seinen Namen.


7
Beachten Sie, dass dies wirklich von der verwendeten Shell abhängt. Da Sie dies nicht angegeben haben, ist es schwierig, die nicht vorhandene "portable" Antwort zu geben.
Randal Schwartz

16
@ Randall, vielleicht könnten Sie alle Ihre individuellen Shell-Kommentare zu einer Voltron-Shell-Antwort zusammenfassen.
hyperslug

@ Randall. Ich habe Bash benutzt. Es funktioniert auch in ksh und zsh. Das Programmieren habe ich übrigens erst ab 1994 gelernt Perl lernen also entschuldige mich, während ich ein bisschen fanboy. :)
Yitzchak

Hmm, ich habe verwendet cd $OLDPWD dafür. Es ist schön, dass Mainstream-Shells eine viel kürzere Form bieten.
ulidtko

2
@sinni Bestimmte Geschmacksrichtungen tun haben pushd, und zumindest ist es ein eingebautes bash.
slhck

105

Zusätzlich zu Bryans Antwort sollte erwähnt werden, dass es auch welche gibt pushd und popd, die Verzeichnisse wie einen Stapel aufbauen. Dies ist auch unter Windows NT verfügbar. Es ist jedoch nicht in allen Shells verfügbar.

Zum Beispiel können wir zu drei verschiedenen Verzeichnissen gehen, und Sie werden immer Ihren Stapel sehen, wenn Sie aufrufen pushd:

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

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

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

Und wenn du anrufst popd dreimal hintereinander gelangen Sie in umgekehrter Reihenfolge zu diesen Verzeichnissen im Stapel. Gleichzeitig wird der Stapel wieder geleert.

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

charon:Movies werner$ popd
~/Documents ~

charon:Documents werner$ popd
~

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

Wenn Sie Zsh verwenden; Es verfügt über eine AUTO_PUSHD-Option, die automatisch gedrückt wird cd ist auf dem stapel.


pushd und popd sind nicht in allen Shells verfügbar.
Randal Schwartz

5
@ Wiesław: Wirklich? Ich wünschte, Bash hätte das ... Natürlich könnte ich alias cd zu pushdund es wäre meistens dasselbe.
Chris Charabaruk

3
Oder alias pd pushen und beides haben. BTW pushd (oder pd, wenn Sie es als Pseudonym verwenden) tauscht das aktuelle Verzeichnis und das zuletzt gepushte Verzeichnis aus, um im Wesentlichen das zu erreichen, was 'cd -' bewirkt.
JRobert

Ich mag das Konzept, habe mich aber nie an sie gewöhnt.
Thorbjørn Ravn Andersen

13

Es gibt einige "Sprung" -Programme

  • Autojump (gepflegt mit Grundausstattung)
  • j2 (anscheinend nicht mit einigen erweiterten Funktionen gepflegt)
  • z (Gepflegte Version von "j" mit erweiterten Funktionen)

Diese erleichtern jede Art der Verzeichnisnavigation. Sie verwenden es, indem Sie einen Teil des Pfades angeben, und es funktioniert einfach.

In Ihrem Fall

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

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

Sie können diesen Programmen einen beliebigen Buchstaben zuweisen, "j" ist Tradition :)

j2 und z unterstützen mehrere Suchbegriffe, ...

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

... und mehr Möglichkeiten.

~$ 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" ist eindeutig schalenspezifisch. Das hast du nicht gesagt.
Randal Schwartz

3
@ Randal: Wie ist es Shell-spezifisch? Es ist ein Programm.
Fixee

3
Ich bin ein Idiot. :) Ich sehe es jetzt.
Randal Schwartz

10

Zusätzlich zu cd - und cd $OLDPWD

Sie können die Verlaufssuche verwenden, indem Sie drücken CTRL-R und tippe ein paar Buchstaben des cd Befehl, den Sie zuvor eingegeben haben. Drücken Sie CTRL-R bringt immer wieder ältere Übereinstimmungen.

Diese Methode ist nützlicher, wenn Sie mehr als zwei Pfade ändern müssen.


1
STRG-R wird nicht unbedingt helfen. Sie waren vielleicht in / some / obscure / directory / deep und haben "cd evendeeperdir" gemacht und sind dann zu ~ / somehere / different gegangen.
justintime

1
Großartig! Es funktioniert für andere Dinge als cd, tolle Hilfe!
Niloct

9

Sie können dies verwenden, um Aliase für Verzeichnisse zu erstellen:

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

a 1

und später:

1

1
Nur auf einer Shell, die Aliase und Funktionen versteht. Nicht alle.
Randal Schwartz

so überspringt dies die Eingabe alias = Teile? hmmmm
Xen2050

6

bashmarks Mit dieser Option können Sie eine Reihe von Ordnern mit einem Lesezeichen versehen und mit Tabulatorvervollständigung zwischen ihnen wechseln:

Um einen Ordner mit einem Lesezeichen zu versehen, gehen Sie einfach zu diesem Ordner und setzen Sie ein Lesezeichen:

bookmark foo

Das Lesezeichen wird "foo" genannt. Wenn Sie zu diesem Ordner zurückkehren möchten, verwenden Sie:

go foo

So zeigen Sie eine Liste der Lesezeichen an:

bookmarksshow

Die Tab-Vervollständigung funktioniert, um zum Shoobie-Lesezeichen zu gelangen, einfach:

go sho[tab]

4

Eine andere Möglichkeit wäre, nur zwei Fenster offen zu halten, wobei sich eines in jedem Verzeichnis befindet.


Kein gemeinsamer Verlauf, wenn Sie frühere Befehle regelmäßig verwenden / bearbeiten (möglicherweise werden sie durch Zurücksetzen abgerufen ...?)
Xen2050

@ Xen2050 Siehe Shell-Option share_history in zsh.
Radon Rosborough

4

Ich weiß, dass dies nicht unbedingt eine Antwort auf Ihre Frage ist, aber es ist hilfreich, um das Ziel von zu erreichen Sie zu Ihren wichtigen Verzeichnissen bringen .

in jeder absteigenden UNIX-bash können Sie verwenden CDPATH um den Ordner zu erweitern, in dem der cd-Befehl sucht.

aus meiner .bashrc-datei:

export CDPATH='.:~/source/'

CD suche zuerst in deinem aktuellen ordner, dann in meinem codier-projekt-verzeichnis.

cd myproject

.. bringt mich zu ~ / sources / myproject von wo immer ich gerade stehe.

Einfaches kleines Feature, das meiner Verzeichnisnavigation sehr geholfen hat.


1
+1 Dies fügt den CDPATH-Ordner hinzu cd 's Autocomplete (TAB) Liste, die gut ist. Aber wenn das . ist nicht enthalten und wenn es einen Ordner in einem CDPATH-Ordner mit dem gibt gleicher Name als eine in Ihrem aktuellen Verzeichnis, dann cd samename Wechselt in das CDPATH-Verzeichnis und nicht die im aktuellen Verzeichnis, die schlecht ist. Benutzen müssen cd ./samename in einen Dup-Ordner gelangen.
Xen2050

Ja, guter Kommentar. Geben Sie immer die erste an . Oder du wirst seltsames Zeug erleben.
phareim

3

Jep, cd - ist der Weg zu gehen, aber ich mache mir Sorgen über den Mangel an Kraft, den Sie in Ihrer Schale haben. popd und pushd sind auch gut, und das j das sieht auch gut aus.

Ich werde mein eigenes Dienstprogramm in den Ring werfen ... es ist nur etwas, das ich in den letzten 10 Jahren mit mir erstellt, angepasst und migriert habe, und es funktioniert einwandfrei für das, was ich möchte.

Blogpost für mein Verzeichnisverwaltungsdienstprogramm

Wenn es für dich funktioniert, dann großartig, aber wenn es mir dann nichts verspricht, bekommst du etwas anderes :) Du kannst einfach nicht damit leben cd allein.


3

Wenn Sie nur 2 Verzeichnisse haben, ist der einfachste Weg, wie erwähnt,

cd -

Wenn ich solche Dinge in der Vergangenheit hatte, hatte ich ein paar Tricks, die hilfreich sein könnten.

  1. Fügen Sie Alias-Befehle in die CSHRC-Datei ein

    alias moo /etc/foo/bar/baz/moo  
    alias logs cd /var/lib/fubarred_app/blargh/logs
    
  2. Verknüpfen Sie Verknüpfungen mit den Pfaden von Interesse aus meinem Home-Verzeichnis. Dies ist eine einmalige Sache.

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

Dies würde das Ändern eines Verzeichnisses so einfach machen wie:

   cd ~/moo
   cd ~/blargh

2

Autojump ist ein bash / sh / zsh "cd" -Befehl, den Sie aus Ihren Aktionen entnehmen können Video .

das würde dich also zu moo bewegen, nachdem es die letzten ordner gelernt hat

j moo

2

Strahl

Ich habe mein eigenes Werkzeug, werde aber einen Blick auf Dereks Werkzeug werfen und j auch.

Natürlich ist die erste Wahl, um hin und her zu springen

cd -

Mein Tool ist für Verzeichnisse mit eindeutigen Namen auf Systemen gedacht, auf denen locate ist verfügbar; Es sucht nach einem passenden Verzeichnisnamen und springt in die erste Übereinstimmung:

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

Abhängigkeiten:

  • Lokalisieren
  • grep
  • Kopf

Nachteile:

  • neuere Verzeichnisse als das zuletzt aktualisierte b-run wurden nicht gefunden
  • Wenn mehr als ein Verzeichnis übereinstimmt, hängt es von Ihrem Glück ab, ob Sie zu dem Verzeichnis übertragen werden, an das Sie gedacht haben.

Verbesserungen / Modifikationen:

  • Anstatt das erste Verzeichnis auszuwählen, kann der Code geändert werden, um eine Auswahlliste anzuzeigen, in der der Benutzer aufgefordert wird, 1,2,3 einzugeben ...

Verwendungszweck:

  • Fügen Sie die Funktion in /etc/bash.bashrc oder ~ / .bashprofile ein, um sie auf bequeme Weise zu verwenden.

Vorteil meiner Lösung:

  • nicht auf 2 Verzeichnisse beschränkt, wie cd -
  • Sie müssen die Verzeichnisse nicht ein einziges Mal besuchen, bevor Sie den Balken verwenden.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.