Warum funktioniert das Platzhalterzeichen * beim Verzeichniswechsel nicht?

Warum funktioniert das Platzhalterzeichen * beim Verzeichniswechsel nicht?

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 CDPATHFunktion sowie pushdund zu verwenden popd.

Die CDPATHFunktion (vielleicht erstmals in tcsh zu sehen) ist eine durch Doppelpunkte getrennte Liste von Verzeichnissen. Wenn das übergeordnete Element Ihres thedirectoryiwanttogointoNamens einigermaßen eindeutig ist, können Sie das übergeordnete Element zur Liste hinzufügen.

Zum Weiterlesen (die Manualpage Ihrer Shell sollte zuerst stehen):

pushdund popdsind 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 /homeund 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 /homekann 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 cdin das erste Verzeichnis (die Reihenfolge ist nicht angegeben), dessen Name mit beginnt foound 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 yashwenn 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 VerzeichnishineinCDPATHoder das Erstellen einer Shell-Variable, $FOOdie 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.

verwandte Informationen