Zoxide - Schneller Verzeichniswechsel

  Ralf Hersel   Lesezeit: 8 Minuten  🗪 6 Kommentare Auf Mastodon ansehen

Wer im Linux-Terminal schnell zwischen Verzeichnissen wechseln möchte, findet mit diesem Werkzeug eine Lösung.

zoxide - schneller verzeichniswechsel

Die üblichen Terminal-Shells (bash, fish, zsh, usw.) bieten von Haus aus keine Unterstützung für einen schnellen Verzeichniswechsel. Dort hangelt man sich mit cd von Ordner zu Ordner. Vor vier Jahren habe ich einen Artikel über das Skript Z geschrieben, das einen schnellen Verzeichniswechsel ermöglicht. Seitdem verwende ich Z für diese Aufgabe. Nun hat im Chat jemand darauf hingewiesen, dass Z seit Jahren nicht mehr gepflegt wird und man stattdessen Zoxide verwenden kann. Mit Vorteil kann man gleich noch den Fuzzy Finder fzf installieren, da dieser bei manchen Funktionen von Zoxide verwendet wird.

Installation

Sowohl Zoxide als auch fzf sind in den Repositories der bekannten Distribution vorhanden und lassen sich mit deren Paketmanagern bequem installieren. Ich bin mir nicht sicher, ob die Installation auch einen Zusatz in der Shell-Konfiguration beinhaltet. Das lässt sich leicht nachsehen und ggf. ergänzen. Bei der Z-Shell heisst die Konfigurationsdatei .zshrc und befindet sich im Home-Verzeichnis. Für Zoxide und fzf muss dort am Ende der Datei jeweils eine Zeile eingefügt werden:

# Ralf: fast directory switch
eval "$(zoxide init zsh)"
source <(fzf --zsh)

Es lohnt sich, den Eintrag zu kommentieren, damit man später weiss, was es damit auf sich hat. Dieser Eintrag ist für jede Shell anders, weshalb ihr hier schauen solltet, wie die Ergänzung für eure Shell heisst. Gleiches gilt für den fzf Eintrag, den ihr hier findet. Danach solltet ihr das Terminal schliessen und wieder öffnen.

Funktioniert es?

Jetzt könnt ihr im Terminal testen, ob der schnelle Verzeichniswechsel funktioniert. Dazu wechselt ihr zuerst mit cd in ein paar willkürliche Verzeichnisse. Das ist nötig, damit Zoxide sich das merken und priorisieren kann. Angenommen ihr seid vorher in das Verzeichnis /home/Dokumente gewechselt, könnt ihr nun (von beliebiger Stelle im Verzeichnisbaum) das ausprobieren:

Falls ihr wissen möchtet, welche Verzeichnisse Zoxide kennt, gebt ihr das ein: zoxide edit

Bei einem z do ist nicht klar, welches Verzeichnis gemeint ist (Downloads oder Dokumente). In diesem Fall könnt ihr z do SPACE + TAB eingeben, worauf Zoxide eine Auswahl präsentiert:

Auf den Quellseiten findet ihr noch weitere Funktionen von Zoxide. Das gilt auch für den Fuzzy Finder fzf, auf den ich hier nicht näher eingehen werde. Dennoch könnt ihr testen, ob die Installation funktioniert hat. Dazu gebt ihr im Terminal fzf ein. Nun solltet ihr eine lange Liste von Dateien sehen, in denen ihr suchen könnt.

Pro Tipp

Aber Ralf, warum muss ich denn erst in jedes Verzeichnis cd'en, bevor Zoxide es kennt? Damit das Werkzeug das Ranking ermitteln kann. Ja, aber geht das nicht anders? Doch, man kann Zoxide mit Verzeichnissen anfüttern. Dafür gibt es das Kommando zoxide import. Damit kann man dem Tool eine Verzeichnisliste unterjubeln.

Doch wie erstellt man eine Verzeichnisliste? Ganz einfach, mit: find . -type d. Aber Achtung, das wollt ihr nicht, weil damit auch alle hidden-Verzeichnisse gemeint sind (die mit dem Punkt vor dem Verzeichnisnamen). Ihr wollt nicht tausende Cache-Verzeichnisse von Firefox usw. aufnehmen. Selbstverständlich kann man die hidden-Verzeichnisse ausschliessen und das Ergebnis in eine Datei schreiben. Das geht so:

find . ! -path '*/.*' -type d > verzeichnisse.txt

Das sind dann immer noch ein paar tausend Verzeichnisse. Bevor ihr diese Liste an Zoxide verfüttert, könnt ihr in die Datei schauen und entscheiden, ob ihr das wirklich möchtet. Nun wird es etwas schwierig, weil Zoxide eine Textdatei mit Verzeichnissen nicht importieren kann. Zwar gibt es das Kommando zoxide import, dort da blicke ich nicht durch. Mit dem Kommando zoxide add kann man einzelne Pfade importieren. Also basteln wir ein Shell-Skript, welches diese Aufgabe übernimmt. In der Datei verzeichnisse.txt sieht es z. B. so aus:

./Books/Aufbruch mit den Hobbits.[rtf_jpg_nfo]/Hobbit-Presse (Hrsg.) (77)
./Books/Eco_ Umberto
./Books/Eco_ Umberto/Der Name der Rose (375)
./Books/Eco_ Umberto/Wie man mit einem Lachs verreist (379)
./Books/Eco_ Umberto/Uber Gott und die Welt (371)
./Books/Eco_ Umberto/Derrick oder die Leidenschaft fur das Mittelmass (362)

Damit kann Zoxide gar nichts anfangen. Deshalb machen wir den Anfang vom Pfad vollständig und quoten den Pfad:

# den String   ./   durch den String   zoxide add "/home/ralf/   ersetzen
sed -i 's/\.\//zoxide add "\/home\/ralf\//g' verzeichnisse.txt 
# Gänsefüsschen an das Ende jeder Zeile setzten
sed -i s/$/\"/ verzeichnisse.txt 

Dann machen wir daraus ein Shell-Skript, indem wir ein #!/bin/bash in die erste Zeile setzen und die Datei umbenennen (verzeichnisse.sh) und ausführbar machen. So soll es aussehen:

#!/bin/bash
zoxide add "/home/ralf/dev"
zoxide add "/home/ralf/dev/fedigov"
zoxide add "/home/ralf/dev/fedigov/site"

Als letzten Schritt wird das Skript ausgeführt: ./verzeichnisse.sh. Dann kommt die Probe mit: z mond SPACE + TAB:

Perfekt! Die beiden ersten Verzeichnisse sind (mit 8.0) höher gerankt, weil ich diese mit z mond vor dem Screenshot aufgerufen habe.

Fazit

Zoxide ist ein guter Ersatz für das Z-Skript und wird genauso bedient wie Z. Mit dem oben vorgestellten Verfahren kann man alle gewünschten Verzeichnisse in einem Rutsch in den Index von Zoxide einlesen. Danach hat man eine umfassende Suche für den schnellen Verzeichniswechsel zur Verfügung.

Titelbild: https://pixabay.com/photos/girl-leap-clouds-pleasure-heaven-5305455/

Quellen:

https://github.com/ajeetdsouza/zoxide
https://github.com/junegunn/fzf

Tags

Zoxide, Verzeichnis, Ordner, wechseln, Schneller

ubu
Geschrieben von ubu am 3. Februar 2025 um 14:27

Wie machst du das Distro Icon in dem Powerline Prompt?

Ralf Hersel Admin
Geschrieben von Ralf Hersel am 3. Februar 2025 um 21:18

Das ist der Standard in der Manjaro Z-Shell.

Nick
Geschrieben von Nick am 3. Februar 2025 um 16:01

&quot;There is a utility called autojump, which was written in Python by Joël Schaerer (...), which is an advanced version of the cd command.&quot;

"zoxide-import - imports data from other tools - zoxide only imports paths from autojump, since its matching algorithm is too different to import the scores."

ERGO: Das einzige Tool, aus dem zoxide-import Pfadangaben importieren kann, bzw. dessen DB, scheint hier eben dieses autojump zu sein. Nichts von dem habe ich –bislang– getestet. Deswegen: DANKE!

Nick
Geschrieben von Nick am 3. Februar 2025 um 16:03

...Zum Thema fzf (etwas OT): Hier würde ich mir –halt als "GUI"– eine Integration in die "Runner" Dialoge wünschen, also für LXDE lxpanelctl run (bzw. für LXQt das entsprechende Gegenstück).

Auf der Konsole könnte eine entsprechende "Suche" übrigens folgendermaßen funktionieren:

#!/bin/bash

echo -n "fuzzysuche: "
read -r fuzzysuche ; 

# Wir brauchen die Pakete "fzf" und ggf. "pcmanfm" (Gtk), bzw. die Qt Variante.
# Andere DE's/ Dateimanager habe ich halt nicht (ggf. eigenen FM einsetzen).
# Ferner "locate" mit Index, bzw. indizierten Dateien.
# Eine eingebaute AUSWAHL (!) ist hier....
# Die mit TAB "ausgewählten Suchergebnisse" als 'stdout' anzeigen ODER 'öffnen':

read -p "For STDOUT press '1', for 'OPEN individual results' press RETURN: " USER_INPUT
if [[ $USER_INPUT == "1" ]]; then
    locate -i "$fuzzysuche"| fzf -m &&\
    cat $stdout ;
fi
    ergebnis=($(locate -i "$fuzzysuche"| fzf --multi --select-1 --exit-0));
    pcmanfm ${ergebnis[@]}

done;
Nick
Geschrieben von Nick am 3. Februar 2025 um 16:05

...aber natürlich... " ... anstatt "&quot" ;)

Enno
Geschrieben von Enno am 3. Februar 2025 um 17:26

Wer kein separates Programm installieren möchte, sondern mit Bordmitteln auskommen will, für denn käme Navita [0] in Frage.

[0] https://github.com/CodesOfRishi/navita/