Frage Wie kann ich zum vorherigen Verzeichnis wechseln, anstatt hinaufzugehen?


Momentan verbringe ich einen Großteil meiner Arbeitszeit damit, zwischen zwei Pfaden hin und her zu pendeln, die sehr weit unten am Baum liegen und sich im Wurzelbereich voneinander entfernen. Es fällt mir auf, dass mein Leben viel einfacher wäre, wenn es ein Argument dafür gäbe cd Das bringt den Benutzer zu dem letzten Verzeichnis, in dem sie sich befanden.

Das heißt, wenn ich in:

/etc/foo/bar/baz/moo

und geben Sie dann ein:

cd /var/lib/fubarred_app/blargh/logs

Ich möchte in der Lage sein, in das erste Verzeichnis zurückzugehen, ohne den gesamten Pfad erneut eingeben zu müssen.

Der Speicherschlüssel schneidet es nicht ab, da ich an jedem Ort genug Befehle verwende, dass es genauso schwierig ist, zurückzugehen und den Pfad zu finden, den ich möchte, um es selbst einzugeben.

Gibt es einen kurzen Befehl, mit dem ich einfach zum vorherigen Verzeichnis wechseln könnte?


209
2017-08-17 20:18


Ursprung


zusätzlich zu @Bryan's ausgezeichnete Antwort, Sie könnten in Betracht ziehen, ein Paar von Aliasen für jeden Pfad zu erstellen, so können Sie einfach etwas eingeben wie:bazmoo" oder "blarghlog"bei der Aufforderung :) - warren
Warum benutzt du es nicht einfach? GNU-Bildschirm? - Shi
Welche Schale? Das macht einen großen Unterschied. - Randal Schwartz
@warren dito. das ist meine bevorzugte Art, alles zu tun. die Hälfte von dem, wofür ich meinen Computer verwende, hat jetzt einen eigenen Alias ​​... =) - ixtmixilix
Fasd ist großartig. Hör zu. - majkinetor


Antworten:


Der Befehl

cd -

wird den Tausch durchführen, den Sie auf den meisten Mainstream-Hüllen benötigen, die ältere längere Variante ist

cd "$OLDPWD"

Dies wird die Umgebungsvariable verwenden, die das vorherige Arbeitsverzeichnis enthält.


Das POSIX man Seite für cd Erwähnungen:

BESCHREIBUNG

Wenn während der Ausführung der obigen Schritte die PWD-Umgebungsvariable geändert wird, wird die OLDPWD-Umgebungsvariable ebenfalls in den Wert des alten Arbeitsverzeichnisses geändert (das ist das aktuelle Arbeitsverzeichnis unmittelbar vor dem Aufruf von cd).

OPERANDEN

-Wenn ein Bindestrich als Operand verwendet wird, entspricht dies dem Befehl:

cd "$OLDPWD" && pwd 

welches zum vorherigen Arbeitsverzeichnis wechselt und dann seinen Namen schreibt.


292
2017-08-17 20:23



Denken Sie daran, das hängt wirklich von der Shell ab, die Sie verwenden, und da Sie nicht angegeben haben, wäre es schwer, die nicht existierende "portable" Antwort zu geben. - Randal Schwartz
@Randall, Vielleicht könntest du all deine individuellen Shell-Kommentare in eine Voltron-Shell-Antwort kombinieren. - hyperslug
@Randall. Ich habe Bash benutzt. Es funktioniert auch in ksh und zsh. Übrigens habe ich das Programm von 1994 erstmals gelernt Perl lernen Entschuldigung, während ich ein bisschen Fanboy bin. :) - Yitzchak
Hmm, ich habe gebraucht cd $OLDPWD dafür. Es ist schön, dass Mainstream-Schalen eine kürzere Form bieten. - ulidtko
@sinni Bestimmte Aromen machen haben pushdund zumindest ist es eingebaut bash. - slhck


Neben Bryan's Antwort ist es erwähnenswert, dass es auch 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 in drei verschiedene Verzeichnisse gehen, und Sie werden immer Ihren Stack sehen, wenn Sie anrufen 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 Stack. 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 hat eine AUTO_PUSHD Option, die automatisch drücken wird cdist auf den Stapel.


105
2017-08-17 20:35



Pushd und Popd sind nicht in allen Shells verfügbar. - Randal Schwartz
@ Wiesław: Wirklich? Ich wünschte, Bash hätte das ... Natürlich könnte ich Alias ​​machen cd zu pushdund es wäre meistens dasselbe. - Chris Charabaruk
Oder alias pd zu schieben und beide haben. BTW pushd (oder pd, wenn man es aliasiert) tauscht selbst das aktuelle Verzeichnis und das zuletzt verschobene Verzeichnis aus, was im wesentlichen das leistet, was 'cd -' tut. - JRobert
Ich mag das Konzept, habe mich aber nie daran gewöhnt. - Thorbjørn Ravn Andersen


Es gibt einige "Sprung" -Programme

  • Autosprung (gepflegt mit grundlegenden Funktionen)
  • j2  (scheinbar nicht gepflegt mit einigen erweiterten Funktionen)
  • z (gepflegte Version von "j" mit erweiterten Funktionen)

Diese erleichtern jede Art von Verzeichnisnavigation. Du benutzt es, indem du einen Teil des Pfades gibst 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 jedem dieser Programme 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

13
2017-08-17 23:52



"j" ist eindeutig Shell-spezifisch. Das hast du nicht gesagt. - Randal Schwartz
@Randal: Wie ist es Shell-spezifisch? Es ist ein Programm. - Fixee
Ich bin ein Idiot. :) Ich sehe es jetzt. - Randal Schwartz


Zusätzlich zu cd - und cd $OLDPWD

Sie können die Verlaufssuche verwenden, indem Sie drücken CTRL-R und ein paar Buchstaben des cd Befehl, den Sie zuvor eingegeben haben. Drücken CTRL-R wiederholt werden ältere Spiele bringen.

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


10
2017-08-18 09:44



CTRL-R wird nicht unbedingt helfen. Sie könnten in / einige / obskur / directory / deep gewesen sein und "cd evendeeperdir" gemacht haben und dann zu ~ / somewhere / different gegangen sein. - justintime
Groß! Es funktioniert für andere Dinge als cd, tolle Hilfe! - Niloct


Sie können damit leicht Aliase für Verzeichnisse erstellen:

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

a 1

und später:

1

9
2017-08-18 01:50



Nur für eine Shell, die Aliase und Funktionen versteht. Nicht alle tun. - Randal Schwartz
so das überspringt die Eingabe der alias = Teile? hmmmm - Xen2050


Bashmarks können Sie eine Reihe von Ordnern Lesezeichen setzen und zwischen ihnen mit Tab-Vervollständigung springen:

Um einen Ordner als Lesezeichen zu speichern, gehen Sie einfach in diesen Ordner und markieren Sie ihn wie folgt:

bookmark foo

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

go foo

Um eine Liste der Lesezeichen zu sehen:

bookmarksshow

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

go sho[tab]

6
2017-08-18 08:54





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


4
2017-08-18 03:00



Kein gemeinsamer Verlauf, wenn Sie vorherige Befehle regelmäßig verwenden / bearbeiten (vielleicht würde ein Reset sie bekommen ...?) - Xen2050
@ Xen2050 Siehe die Shell-Option share_history in zsh. - Radon Rosborough


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

in jedem Fall kann UNIX-Bash verwendet werden CDPATH um den Ordner zu erweitern, in dem der cd-Befehl sucht.

aus meiner .bashrc-Datei:

export CDPATH='.:~/source/'

CD sucht zuerst in Ihrem aktuellen Ordner und sucht dann in meinem Coding-Projekt-Verzeichnis.

cd myproject

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

Einfaches kleines Feature, das meiner Verzeichnis-Navigation sehr geholfen hat.


4
2017-08-19 11:11



+1 Dies fügt den CDPATH-Ordner hinzu cdAutovervollständigen (TAB) Liste, die gut ist. Aber wenn die . ist nicht enthalten und wenn es einen Ordner in einem CDPATH-Ordner mit der gleicher Name als eine in Ihrem aktuellen Verzeichnis, dann cd samename wird in das CDPATH-Verzeichnis gehen und nicht der eine im aktuellen Verzeichnis, der ungültig ist. Benutzen müssen cd ./samename um in einen dup Ordner zu gelangen. - Xen2050
Ja, guter Kommentar. Immer die erste einbeziehen .oder du wirst seltsame Sachen erleben. - phareim


Jep, cd - ist der Weg zu gehen, aber ich sorge mich um den Mangel an Kraft, die Sie in Ihrer Shell haben. popd und pushd sind auch gut, und das j Ding sieht auch gut aus.

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

Blogpost für mein Verzeichnisverwaltungsprogramm

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


3
2017-08-18 14:18





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 ich gemacht habe, die hilfreich sein könnten.

  1. Setzen Sie Alias-Befehle in die .cshrc-Datei, etwa so

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

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

Dies würde es ermöglichen, ein Verzeichnis so einfach zu ändern wie:

   cd ~/moo
   cd ~/blargh

3
2017-08-19 03:08