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.)
- ~/
- ~/anderesVerzeichnis
- ~/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 ~/otherDirectory
Nr. 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 DIRSTACK
in 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 dirs
Befehl können wir ein n-tes Element vom Stapel abrufen. Mit dieser Ausgabe als Argument cd
kö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 cd
Aufruf pushd
mit 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
csh
hat eine eigene Verzeichnisstapelimplementierung, ksh
tut 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 3
ob 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, stat
und verwenden dann die Kombination aus find
undcd
$> 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 find
der 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/long
auch 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