
Ich befinde mich beispielsweise in meinem Verzeichnis:
/home/myname
und dann möchte ich von der CD in ein anderes Verzeichnis wechseln.
/home/pulsar/...
Da ich ziemlich tief in das andere Verzeichnis gehen muss, wie kann ich das machen, ohne die ganze Zeile eintippen zu müssen? Ich habe versucht
cd */thedirectoryiwanttogointo
aber das funktioniert nicht. Ich muss die ganze Zeile eintippen.
Antwort1
Wahrscheinlich funktioniert Ihr Platzhalter aus folgendem Grund nicht:
- Es gab keine Übereinstimmungen für den Platzhalter vom angegebenen Standort aus, oder
- Es gab mehr als ein Spiel.
Der übliche Ansatz (in einer Shell) zum häufigen Wechseln zwischen Unterverzeichnissen besteht darin, die CDPATH
Funktion sowie pushd
und zu verwenden popd
.
Die CDPATH
Funktion (vielleicht erstmals in tcsh zu sehen) ist eine durch Doppelpunkte getrennte Liste von Verzeichnissen. Wenn das übergeordnete Element Ihres thedirectoryiwanttogointo
Namens einigermaßen eindeutig ist, können Sie das übergeordnete Element zur Liste hinzufügen.
Zum Weiterlesen (die Manualpage Ihrer Shell sollte zuerst stehen):
- Was ist CDPATH?
- 3.4. Verzeichniswechsel mit
cd
(Schritt-für-Schritt-Anleitung für Red Hat Enterprise Linux) - So ändern Sie den CDPATH für die C-Shells: csh und tcsh
pushd
und popd
sind neuer als CDPATH
, stammen aber immer noch aus der Mitte der 1990er Jahre. Sie ermöglichen es Ihnen, Ihr aktuelles Verzeichnis während der jeweiligen Befehle zu speichern („auf einen Stapel verschieben“) und wiederherzustellen („von einem Stapel abheben“) cd
. Weitere Informationen:
Andere Leute verwenden Shell-Aliase oder symbolische Links. Diese sind besonders nützlich, wenn man bekannte Orte aufsucht.
Antwort2
Vorausgesetzt, alle möglichen Zielverzeichnisse befinden sich darunter /home
und die Verzeichnisnamen enthalten keine Zeilenumbruchzeichen, können Sie diese Shell-Funktion verwenden:
cds() {
cd "$(find /home -type d -name "$1" | head -n 1)"
}
$ cds thedirectoryiwanttogointo
Natürlich /home
kann die Leistung erheblich variieren, je nachdem, wie viele Unterverzeichnisse und Dateien sich darunter befinden und ob Ihr Betriebssystem in der Lage ist, den gesamten Baum im Speicher zwischenzuspeichern oder nicht.
Auf GNU-Systemen können Sie es beschleunigen und zuverlässiger hinsichtlich Zeilenumbruchzeichen in Dateinamen machen, indem Sie stattdessen diese Syntax verwenden:
cds() {
cd "$(find /home -type d -name "$1" -print -quit)"
}
Dadurch wird die Suche beendet, sobald die erste Übereinstimmung gefunden wurde.
Beachten Sie, dass das Argument als Muster verwendet wird. Sie haben daher folgende Möglichkeiten:
cds 'foo*bar'
beispielsweise cd
in das erste Verzeichnis (die Reihenfolge ist nicht angegeben), dessen Name mit beginnt foo
und auf endet bar
.
Antwort3
Sie möchten mithilfe der Platzhaltererweiterung einen Pfad an beliebiger Stelle im System finden. Dies ist möglich, wenn Sie das Muster richtig angeben:
cd /**/thedirectoryiwanttogointo
funktioniert standardmäßig in zsh und fish,in Bash, wenn Sie zuerstshopt -s globstar
, Intcsh, wenn duset globstar
, in ksh93 wenn Sie set -o globstar
, in yash
wenn Sie set -o extended-glob
.
Dies funktioniert, weil das Platzhalterzeichen innerhalb eines absoluten Pfads verwendet wird, der mit beginnt, /
statt relativ zum aktuellen Verzeichnis zu sein, und weil es sich bei Auswahl des **
Musters auf eine beliebige Anzahl von Unterverzeichnissen ausdehnt.
Dies funktioniert zwar,es wird wahrscheinlich sehr lange dauern. Ihre Shell muss Ihr gesamtes System nach den passenden Dateien durchsuchen. Sie können dies verkürzen, indem Sie ein längeres Präfix angeben, um mehr vom Suchraum einzuschränken:
cd /home/pulsar/**/thedirectoryiwanttogointo/
Je tiefer Sie vordringen, desto weniger Sucharbeit müssen Sie leisten. Wenn der Verzeichnisbaum relativ dünn ist, dauert dies nicht zu lange und ist tatsächlich praktisch anzuwenden. Durch das Anhängen /
wird sichergestellt, dass die Erweiterung nur auf ein Verzeichnis erfolgt, wodurch eine Art von Mehrdeutigkeit beseitigt wird, die auftreten könnte.
Wenn es immer noch mehr als eine Übereinstimmung gibt, hängt das Ergebnis von Ihrer Shell ab. Bash und fish wechseln zur alphabetisch ersten Übereinstimmung und ignorieren die Mehrdeutigkeit. tcsh und yash melden einen Fehler. zsh und ksh interpretieren es als Versuch, eine ihrer erweiterten Verzeichniswechselfunktionen zu verwenden undwahrscheinlicheinen Fehler melden.
Wenn Sie wahrscheinlich dasselbe Verzeichnis wiederholt verwenden, können Sie entweder das übergeordnete VerzeichnishineinCDPATH
oder das Erstellen einer Shell-Variable, $FOO
die Sie anstelle des langen Pfads verwenden können, ist eine bessere Option. Sie können die Shell-Variable mit **
der Erweiterung kombinieren, um mehr Tipparbeit zu sparen, wenn Sie sie häufig verwenden.
Antwort4
Wenn Sie immer in dasselbe tiefe Verzeichnis gehen, besteht eine einfache Lösung darin, einen symbolischen Link dorthin zu erstellen:
ln -s ~/foo/bar/baz/quux/etc/etc/etc/target ~/shortcut
Wenn Sie das Verzeichnis schon einmal aufgerufen haben, können Sie auch Ihren Befehlsverlauf nach dem gewünschten Namen durchsuchen. Drücken Sie dazu Strg-R und die zu suchenden Zeichen. Dies ist Bash-spezifisch, aber ich nehme an, dass die meisten modernen Shells über eine ähnliche Funktion verfügen.