22 Punkte von GN⁺ 2026-05-11 | 1 Kommentare | Auf WhatsApp teilen
  • Der Kommandozeilen-Fuzzy Finder fzf liefert einen sofort spürbaren Return on Investment und einen einzigartigen Mehrwert, aber viele Entwickler installieren das Tool nur und geben dann auf, weil sie nicht wissen, wie sie es nutzen sollen
  • Es kann die Ctrl+R-Verlaufssuche durch Fuzzy Matching und mehrere Vorschauen ersetzen und so die Unbequemlichkeit der bisherigen Suche mit exakter Zeichenkettenübereinstimmung beseitigen
  • Mit Alt+C ist fuzzy cd möglich, selbst wenn man sich nur vage an den Verzeichnisnamen erinnert, und mit der Kombination vi $(fzf) lässt sich ein Workflow aufbauen, um Dateien sofort zu öffnen
  • In Verbindung mit ripgrep per Pipe ist auch eine fortgeschrittene Nutzung möglich: jede Zeile in allen Dateien fuzzy durchsuchen und die betreffende Datei direkt im Editor öffnen
  • Ein Werkzeug mit so unmittelbarem Produktivitätsgewinn, dass es sogar die 80/20-Heuristik aushebelt, nach der man zuerst klassische Unix-Tools wie cat, grep oder find lernen sollte

Welchen Wert fzf direkt nach der Installation bringt

  • Softwareingenieure können leicht Werkzeuge bauen, um ihre Arbeit zu verbessern, aber wenn man ständig zwischen vielen Tools wechselt und keines wirklich vertieft, steigen die Kosten mit der Zeit
  • Eine gute 80/20-Heuristik ist, zuerst alte Unix-Tools wie cat, ls, cd, grep und cut zu lernen; in moderneren Systemadministrationsrollen gehören auch sed und awk dazu
  • fzf kann als Ausnahme zu dieser Heuristik gelten, weil der Return on Investment sofort einsetzt und sein Nutzen sehr eigenständig ist
  • Entscheidend sind die Funktionen, die sich in einer Standard-Ubuntu-Umgebung direkt nach der Installation mit dem fzf-Installationsskript sofort nutzen lassen

Die unmittelbare Wirkung der Standard-Shortcuts

  • Ctrl+R: Befehlsverlauf als Fuzzy-Suche

    • In den meisten Linux- und Windows-Terminals bietet Ctrl+R eine rückwärts gerichtete Suche im Befehlsverlauf
    • Das standardmäßige Ctrl+R verlangt exakte Übereinstimmung, um den gewünschten Befehl zu finden, und zeigt immer nur eine Vorschau gleichzeitig, sodass schon ein falscher Buchstabe das Auffinden erschwert
    • Wenn fzf installiert ist, werden mehrere Tastenkürzel mit besseren Verhaltensweisen überschrieben, und auch Ctrl+R wird gegenüber der bisherigen Methode deutlich verbessert
    • Bei einer Installation über einen Paketmanager wie apt ist diese Integration der Shortcuts möglicherweise nicht enthalten; genau deshalb lohnt sich das fzf-Installationsskript
  • Alt+C: Schnell in ein nur halb erinnerliches Verzeichnis wechseln

    • fzf ersetzt Alt+C durch ein erweitertes Fuzzy-cd-Kürzel
    • So kann man schnell dorthin wechseln, wenn man sich nicht mehr an den genauen Pfad erinnert, sondern nur noch ungefähr an den Namen des Verzeichnisses
    • Das ist nützlich, wenn man in einem leeren Terminal ein Repository oder Arbeitsverzeichnis wiederfinden will, das man lange nicht besucht hat

Der Befehl fzf selbst und Shell-Kombinationen

  • Grundlegendes fzf

    • Wenn man den Befehl fzf direkt ausführt, durchsucht er relative Dateipfade im aktuellen Verzeichnis per Fuzzy Search
    • Allein für sich ist der Nutzen begrenzt, weil es im Grunde nur um die Auswahl eines Dateipfads geht
  • vi $(fzf)

    • In Kombination mit Command Substitution wie vi $(fzf) kann man die per Fuzzy Search ausgewählte Datei direkt im Editor öffnen
    • Das ist nichts Spezifisches an vi; es funktioniert ebenso mit emacs, nano, code oder einem beliebigen anderen Editor
  • vi $(find . '/' | fzf)

    • Kombiniert man find . '/' | fzf mit einem Editor, kann man eine Konfigurationsdatei, deren Speicherort man nicht kennt, aus einer Liste vollständiger Pfade fuzzy suchen und öffnen
    • Wenn man eine Datei wie nginx.conf sucht und nicht mehr weiß, wo sie liegt, muss man nicht FHS-Wissen hervorkramen oder Pfade auswendig wissen; man leitet einfach die find-Ausgabe an fzf weiter
    • Mit einer Suche wie conf$ kann man auf Zeilen filtern, die auf conf enden
    • Wenn find auf viele Permission denied-Fehler trifft, kann fzf kurz ins Stocken geraten, erholt sich aber nach ein paar Sekunden wieder
    • Diese paar Sekunden Verzögerung sind der Trade-off für die sehr einfache Methode, Konfigurationsdateien zu finden
  • vi **<TAB>

    • Eine Funktion aus einem Hacker-News-Kommentar von sigmonsays: Zwischen überschriebenen Shortcuts und dem direkten Ausführen von fzf gibt es eine Art fuzzy Tab Completion mit zwei Sternchen
    • vi **<TAB> kann ähnlich wie vi $(fzf) zur Dateiauswahl verwendet werden
    • Nachdem der eigentliche Befehl vervollständigt wurde, muss man noch einmal Enter drücken
    • In bash und zsh funktioniert das gut, in fish dagegen manchmal nicht
    • Wenn man sich das explizite Aufrufen von $(fzf) leichter merken kann, nutzt man diese Funktion vielleicht nicht allzu oft

fzf auch zum Verschieben von Dateien

  • mv $(fzf) $(fzf)

    • mv $(fzf) $(fzf) ist nützlich, wenn man sich weder genau daran erinnert, was verschoben werden soll, noch wohin, aber für beides sehr konkrete Hinweise im Kopf hat
    • Dabei wählt man in zwei fzf-Durchläufen Quelle und Ziel aus
    • Bei Arbeiten wie dem Verschieben und Anordnen von Dateien, etwa um GIFs in ein GitHub-README einzubauen, kann das schnell zur Routine werden
    • Als verwandtes Beispiel wird das finstem-README zum interaktiven Modus verlinkt

Mit rg kombiniert bis in Dateiinhalte hinein fuzzy suchen

  • rg: schnelles grep mit rekursiver Suche als Standard

    • Die folgende Kombination ist auch mit grep möglich, aber rg bzw. ripgrep hat hier Vorteile, weil rekursive Suche standardmäßig aktiviert ist
    • Um die Beispiele nachzuvollziehen, wird empfohlen, rg zu installieren und zu verwenden
  • rg . | fzf

    • rg . gibt jede Zeile der Dateien als Suchergebnis aus; leitet man das an fzf weiter, kann man jede Zeile in allen Dateien fuzzy durchsuchen
    • Dabei sucht man nicht anhand des Dateinamens, sondern anhand von Zeileninhalten innerhalb der Dateien
  • rg . | fzf | cut -d ":" -f 1

    • Hängt man an das mit rg . | fzf ausgewählte Ergebnis cut -d ":" -f 1 an, erhält man das erste durch Doppelpunkte getrennte Feld, also den Dateipfad
    • Das ist eine Kombination, mit der man zuerst Zeileninhalte fuzzy durchsucht und dann nur den Pfad der Datei erhält, die diese Zeile enthält
  • vim $(rg . | fzf | cut -d ":" -f 1)

    • vim $(rg . | fzf | cut -d ":" -f 1) durchsucht zunächst jede Zeile in allen Dateien per Fuzzy Search und öffnet dann die Datei mit der ausgewählten Zeile in vim
    • Wenn man sich nicht an den Dateinamen erinnert, sondern nur an einen Teil des Inhalts, gelangt man so direkt weiter in den Editor

1 Kommentare

 
GN⁺ 2026-05-11
Lobste.rs-Kommentare
  • Ich scheine genau die Zielgruppe dieses Artikels zu sein. Ich habe fzf installiert und dachte mir „genial“, habe dann aber ständig vergessen, es tatsächlich zu benutzen — jetzt benutze ich es vielleicht doch

    • Der Kern ist die Integration in die vorhandene Shell-Konfiguration, persönliche Skripte und Aliase. Ich benutze fzf ständig, starte es aber fast nie direkt
  • Mag ein guter Artikel sein, aber wenn das Ziel ist, die Frage „Was nun?“ zu beantworten, wirkt es so, als würde man mit fzf-Shell-Integration gleich eine noch engere Zielgruppe ansprechen
    Ich nutze ctrl-r in bash ganz selbstverständlich, und mir zu sagen, ich solle das ersetzen, ist eine zu hohe Einstiegshürde. Lieber hätte ich zuerst gelernt, wie man dieselbe Aktion übt, ohne die Voreinstellung zu ersetzen

    • Tatsächlich ist es eher ein verbesserter Standard. Man sollte es ruhig ctrl-r ersetzen lassen, und die Hälfte des Reizes besteht darin, dass vertraute Abläufe erhalten bleiben, man aber fast denselben Flow mit einer deutlich reicheren Erfahrung bekommt
      ctrl-r ist wahrscheinlich der Befehl, den ich am häufigsten benutze, und fzf war eine Verbesserung, die sofort ohne Lernkurve gepasst hat. Weil es über ctrl-r gestartet wird, vergesse ich auch nicht, fzf zu benutzen. Später bin ich allerdings zur Fish shell gewechselt, wo dieses Verhalten ohnehin standardmäßig vorhanden ist
  • Überzeugt. Ich werde bald fzf mit Shell-Integration ergänzen, und heute habe ich etwas gelernt

  • Wenn man Dateien für einen Befehl finden will, kann man auch die ctrl-t-Tastenkombination verwenden. Ich nutze das oft zusammen mit git, wenn ich Dateien für eine bestimmte Änderung auswähle, und habe es auch schon verwendet, um grep-Ausgaben zu filtern und den Suchbereich einzugrenzen

  • Neben der verbesserten Shell-Verlaufssuche habe ich fzf auch mit den folgenden zwei Aliasen verwendet
    alias gbd='git -c color.ui=never branch | fzf | xargs -I {} git branch -D {}'
    Das nutze ich hauptsächlich, um lokale Branches auszuwählen, die ich nach dem Mergen von Pull Requests löschen will. Es gibt vielleicht eine bessere Methode, aber bisher ist es nie schiefgegangen
    alias awp='export AWS_PROFILE="$(grep -e "\[\(.*\)\]" ~/.aws/config | sed -e "s/\[//g" | sed -e "s/\]//g" | cut -d " " -f 2 | sort -u | fzf)"'
    Damit kann ich AWS_PROFILE schnell anhand der Werte in ~/.aws/config umschalten. Ich überlege inzwischen, auch einen ähnlichen Alias zum Wechseln von Kubernetes-Namespaces zu bauen

  • Mit dem fzf.vim-Plugin kann man fzf in vim verwenden. Damit lässt sich nicht nur nach Dateien, sondern auch fuzzy in Buffern, im Befehlsverlauf und in Dateiinhalten suchen

  • Mein Hauptanwendungsfall für fzf ist das Durchsehen und Durchsuchen des linearen Git-Commit-Verlaufs, um zu verstehen, was sich zuletzt geändert hat
    In meiner Standard-Git-Konfiguration ist git fzf so definiert

    [alias]  
      # Browse commit history with fzf  
      # Inspired by: https://chrismanbrown.gitlab.io/67.html  
      fzf = "!git log --oneline --color=always --decorate=short $@ | \  
          fzf --ansi --reverse --no-sort \  
            --preview 'git show --color=always {1}' \  
            --preview-window '<50(down)' \  
            --bind 'enter:become(git show {1})' #"  
    
  • Ich habe das Gefühl, mir entgeht etwas. Ich frage mich, warum man fzf installiert, wenn man noch gar nicht weiß, was man damit machen soll

  • Dazu gibt es auch einen neueren Beitrag. Ein Nutzer verwendet fzf als Dateiauswähler für jj
    https://lobste.rs/s/exlogg/jjj