CD - weiter in die Geschichte

CD - weiter in die Geschichte

Wie könnte ich etwas Ähnliches wie verwenden cd -, das zum vorherigen Verzeichnis im Verlauf geht, um im Verzeichnisverlauf noch weiter zurückzugehen? Nehmen wir beispielsweise an, mein Verlauf ist: (1 ist aktuell.)

  1. ~/
  2. ~/anderesVerzeichnis
  3. ~/wirklich/langer/Verzeichnisname/den/ich/nicht/noch/eintippen/möchte/aber/nicht/genug/verwende, um/einen/Alias/für/zu/erstellen

Wenn ich es hier verwende cd -, komme ich zu ~/otherDirectoryNr. 2, und wenn ich es erneut verwende, komme ich zurück zu ~/Nr. 1 (in dem ich nicht sein möchte) und nicht zu dem wirklich langen Verzeichnis Nr. 3 (in dem ich sein möchte). Zusammengefasst: Wie navigiere ich weiter zurück in den Verzeichnisverlauf? Gibt es eine Bash, die ich schreiben könnte, um diese Funktionalität hinzuzufügen?

Ich versuche, durch den Verzeichnisverlauf (mehr als nur ein Verzeichnis) zurückzublättern, ähnlich wie man mit dem Aufwärtspfeil durch den Befehlsverlauf blättern würde. Hoffentlich wird dadurch klar, dass diese Frage noch nicht gestellt wurde.

Antwort1

Verzeichnisstapel in Bash

Es gibt etwas, das als Verzeichnisstapel oder DIRSTACKin Bash bekannt ist. Stapel ist eine grundlegende Datenstruktur in der Informatik, in der Sie Elemente übereinander speichern können (wie ein Bücherstapel), aber nur auf das neueste (oben) zugreifen können.

Hier ist eine kleine Demo – jedes Mal, wenn ich etwas auf den Verzeichnisstapel schiebe, wird mein aktuelles Arbeitsverzeichnis auf dieses Element eingestellt; jedes Mal, wenn ich es heraushole, löschen wir das oberste (ganz linke) Element aus dem Stapel und kehren zum nächsten verfügbaren Element zurück:

$>  # pushd navigates to and stores the directory given
$> pwd
/home/xieerqi
$> pushd bin
~/bin ~
$> pushd /etc
/etc ~/bin ~
$> # popd deletes leftmost item, returns to next directory on left$> pwd
/etc
$> popd
~/bin ~
$> pwd
/home/xieerqi/bin
$> 

Das neueste Element wird immer oben im Stapel gespeichert, auch wenn Siecd

$> dirs
/ /etc ~
$> cd /var
$> dirs
/var /etc ~
$> 

Mit diesem dirsBefehl können wir ein n-tes Element vom Stapel abrufen. Mit dieser Ausgabe als Argument cdkönnen wir zu jedem Verzeichnis auf dem Stapel navigieren, ohne den Stapel selbst zu beeinflussen. Beachten Sie unten, wie /etc/und ~(Stapelelemente 1 und 2) gleich bleiben, obwohl ich mein aktuelles Arbeitsverzeichnis (und auch das oberste Element) ändere.

$> dirs
/var /etc ~
$> dirs +1
/etc
$> cd $(dirs +1)
$> pwd
/etc
$> dirs
/etc /etc ~

Verwenden des DIRSTACK-Verhaltens zum Simulieren des Webbrowserverhaltens

Wissen Sie, dass Sie in einem Webbrowser, wenn Sie von URL A zu URL B und URL C springen, mit den Vorwärts- und Rückwärtspfeiltasten zwischen den URLs hin- und herwechseln können?

Nun, dasselbe können wir in Bash mit diesen beiden Funktionen tun:

cd()
{
  if [ $# -eq 0   ]; then
       pushd "$HOME" > /dev/null
  else
       pushd "$@" > /dev/null
  fi
}

cdback()
{
  popd > /dev/null
  printf "Returned to:%s\n" "$( dirs +0)"

}

Funktionen haben Vorrang vor Aliasnamen, daher können wir das zu unserem Vorteil nutzen und jeden cdAufruf pushdmit jedem angegebenen Argument durchführen (und wenn keines angegeben wird, kehren wir zum Home-Verzeichnis zurück; dasselbe Verhalten, aber es wird aufgezeichnet).

$> pwd
/home/xieerqi
$> cd /etc
$> cd /var
$> cd /usr
$> pwd
/usr
$> cdback
Returned to:/var
$> pwd
/var
$> cd
$> pwd
/home/xieerqi

Verzeichnisstapel in anderen Shells

cshhat eine eigene Verzeichnisstapelimplementierung, kshtut es aber nicht. Sie könnten verwenden Eddies Umsetzung

Nach oben mit einer For-Schleife

Um eine bestimmte Anzahl von Verzeichnissen nach oben zu gehen, könnten Sie eine Funktion schreiben, die eine cd ..bestimmte Anzahl von Malen aufruft. Hier ist beispielsweise meine benutzerdefinierte Funktion in.bashrc

function goUp # go up x number of dirs
{
  num=$1
  while [ num -ne 0  ];do
    cd ..
    num=$( expr $num - 1   )
  done
}
# ---

Ich würde das also so aufrufen, als goUp 3ob ich 3 Verzeichnisse hochgehen würde, und es würde cd ..3 Mal aufrufen

Verwenden der Inode-Nummer Diese Methode ist gut, wenn Dieser Trick wird häufig verwendet, wenn der Ordnername schwierige Zeichen/unerkennbare Zeichen enthält. Wir finden die Inode-Nummer des Verzeichnisses, in das Sie wechseln möchten, statund verwenden dann die Kombination aus findundcd

$> stat $HOME/bin/sh/
  File: ‘/home/xieerqi/bin/sh/’
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 801h/2049d  Inode: 5795531     Links: 2
Access: (0775/drwxrwxr-x)  Uid: ( 1000/ xieerqi)   Gid: ( 1000/ xieerqi)
Access: 2015-08-19 15:27:38.280529273 -0600
Modify: 2016-02-20 17:03:49.822700405 -0700
Change: 2016-02-20 17:03:49.822700405 -0700
 Birth: -
$> cd $(find $HOME -inum 5795531 -type d 2>/dev/null)
$> pwd
/home/xieerqi/bin/sh

Dies kann natürlich etwas langsam sein, da findder gesamte Verzeichnisbaum rekursiv durchlaufen wird.

Antwort2

Wenn Sie per cd in ~/really/long/directory/name wechseln und nur in ~/really/long sein möchten, können Sie dies cd ~/really/longauch dann verwenden, wenn Sie sich in einem Unterverzeichnis von „long“ befinden.

Wenn Sie gerade ~/really/long verlassen haben und dorthin zurückkehren möchten, können Sie einfach Folgendes tun:

Cd

Gehen Sie dann mit dem Aufwärtspfeil durch Ihren Befehlsverlauf zu der Stelle, an der Sie

Cd ~/really/long

verwandte Informationen