Bash Verzeichnisnavigation

14.03.2011

Manchmal ist es nicht ganz einfach, sich auf der Linux-Konsole in einer größeren Verzeichnisstruktur zu bewegen. Doch es gibt eine Hand voll Tricks, um sich das Leben zu erleichtern. Man spart sich viele Tippfehler und die “."-Taste nutzt sich auch weniger ab.

Ersetzen von Pfadteilen

Bewegt man sich in einer Verzeichnisstruktur mit vielen gleichartigen Verzeichnissen (z.B. einem Server mit Installationsimages), so möchte man oft einen Teil des Pfades durch einen anderen ersetzen. Sehen wir uns als Beispiel einmal diese Verzeichnisstruktur an:

- var
  \\- install
     |- ServerA
     |  |- etc
     |  \\- bin
     \\- ServerB
        |- etc
        \\- bin

Befindet man sich nun im Verzeichnis /var/install/ServerA/etc und möchte in das gleiche Verzeichnis im Baum des Servers B wechseln, so wäre der normale Weg cd ../../ServerB/etc. Ist die Struktur noch etwas tiefer geschachtelt, so artet das Ganze schnell in eine “.."-Orgie aus. Die Bash-Shell stellt einem jedoch eine Möglichkeit bereit, Teile des aktuellen Pfades zu ersetzen. Nutzt man diese Methode, so sieht der Wechsel von Server A zu Server B folgendermaßen aus: cd ${PWD/ServerA/ServerB/}. Im Prinzip nutzt diese Methode nur die Stringersetzungsfunktionen der Bash aus. Der Befehl liest sich also folgendermaßen: Nimm die Umgebungsvariable PWD (welche in der Bash das aktuelle Verzeichnis enthält) und ersetze alle Vorkommen von ServerA durch ServerB. So lassen sich schnell Teile des aktuellen Pfades durch andere ersetzen. Generisch geschrieben lautet der Befehl also:

cd ${PWD/<Zu ersetzender Pfadteil>/<Neuer Pfadteil>/}

Abschneiden des Pfades

Nehmen wir nun an, wir wollen aus dem Pfad /usr/local/bin/PLUGINS/lib in den Pfad /usr/local wechseln. Natürlich könnte man cd ../../.. eingeben. Jedoch gibt es - unter Nutzung der Bash-Methoden zur Stringmanipulation - auch noch einen einfacheren Weg: cd ${PWD%/bin*}. Diese Zeile nutzt die String-Operation %. Sie löscht alle Zeichen, welche mit dem Ausdruck nach dem %-Zeichen übereinstimmen. D.h. aus dem aktuellen Pfad werden alle Elemente nach /bin, einschließlich /bin gelöscht. Aus diesem Grund muss nach dem Pfadteil auch ein * angegeben werden.

Um also in einen höheren Pfad zu wechseln, muss man einfach den Namen des Verzeichnisses eingeben, welches nicht mehr zum neuen Pfad gehören soll. Auch dieser Befehl lässt sich generisch formulieren:

cd ${PWD%/<Erstes zu löschendes Element>*}

Pfadsuche mit CDPATH

Die Umgebungsvariable PATH kennt wahrscheinlich jeder, der sich mit Linux beschäftigt. Nicht so bekannt ist die Variable CDPATH. Diese funktioniert wie die PATH-Variable, jedoch wird sie nicht beim Ausführen eines Programmes durchsucht, sondern beim Wechseln des Verzeichnisses mit cd. Um das erste Beispiel nochmals zu strapazieren: Setzt man über export CDPATH=/local/install die CDPATH-Variable auf das Verzeichnis /local/install, so kann man über cd ServerA in das Verzeichnis /local/install/ServerA wechseln. Wird beim Ausführen von cd im aktuellen Verzeichnis kein Unterverzeichnis mit dem Namen ServerA gefunden, so wird für alle in CDPATH angegebenen Verzeichnisnamen geprüft, ob ein passendes Unterverzeichnis vorhanden ist. Wird eines gefunden, so wird in dieses gewechselt. So kann also von überall aus in ein Unterverzeichnis von /local/install gewechselt werden.

Ich würde nicht empfehlen CDPATH automatisch zu setzen. Das wäre, wenn man es nach einiger Zeit vergisst, doch sehr verwirrend. Jedoch kann es in einigen Situationen einen Menge Tipparbeit sparen.

Weitere Informationen

Weitere Informationen über die hervorragenden Stringmanipulationsfunktionen der Bash finden sich hier.