fzf-Befehl unter Linux

Schnelles, unscharfes (fuzzy) Finden in der Kommandozeile

Musst du oft lange Datei- oder Verzeichnislisten durchforsten, um das zu finden, was du suchst? Kannst du dich manchmal an den genauen Namen und Speicherort nicht erinnern? 😩

Super! Denn dieser Artikel zeigt dir, wie du mit fzf (Fuzzy Finder) blitzschnell und intuitiv durch alles stöbern kannst. Das geht für Dateien, aber auch für die Befehls-Historie bis hin zu laufenden Prozessen. So kommst du oft schneller als Ziel, als mit anderen Befehlen.

fzf ist ein kommandobasiertes, interaktives Filter-Tool, das Eingaben von stdin entgegennimmt und eine fuzzy-gematchte, interaktive Liste zur Auswahl präsentiert.

Installation

Bei vielen Linux-Distributionen ist das Paket fzf nicht vorinstalliert. Aber das lässt sich ganz leicht nachholen:

1
2
3
4
# Installation unter Debian/Ubuntu:
sudo apt install fzf
# Installation unter Fedora/Redhat:
sudo dnf install fzf

Grundlegende Syntax

Generisch sieht der einfache Aufruf von fzf so aus:

1
fzf [OPTIONEN]

Deine Auswahl wird dann auf stdout (Konsole) ausgegeben. Seine wahre Stärke entfaltet fzf in Kombination mit anderen Befehlen (Pipes) und Shell-Keybindings.

Erstes Beispiel

Klingt kompliziert? Lass es uns besser am ersten, praktischen Beispiel erkunden:

1
history | fzf

Die Eingabe von history gibt deinen Befehlsverlauf aus. Kennst du den Befehl noch nicht, dann ist jetzt ein guter Moment den passenden Artikel dazu zu lesen und dann hierher zurück zu kommen.

Diese Daten werden an fzf weitergegeben. Es öffnet ein interaktives Fenster, in dem du mit Fuzzy-Matching jeden früheren Befehl finden und auswählen kannst.

Die Auswahl erfolgt einfach mit den Pfeiltasten und wird dann in der Kommandozeile ausgegeben:

1
65  sudo apt install smem

Solltest du nicht fündig werden oder keine Auswahl treffen wollen, kannst du den Dialog mit der Tastenkombination [Strg] und [C] wieder verlassen.

Kannst du schon den Vorteil erkennen? Deine eingegebenen Zeichen müssen nicht genau so in der Befehlshistorie auftauchen. Auch für andere Anwendungsfälle gilt das äquivalent. Daher heisst das Tool auch Fuzzy Finder, weil man fuzzy mit ungenau übersetzen kann.

Wichtige Optionen von fzf

Aber bevor wir weiter auf den praktischen Einsatz von fzf schauen, will ich dir ein paar wichtige Parameter zeigen, die du bei dem Befehl verwenden kannst:

Option Bedeutung
--reverse Zeigt die Auswahlliste von umgekehrt an (standardmäßig ist es von unten nach oben).
--multi Erlaubt die Auswahl mehrerer Einträge mit der [Tab]-Taste.
--height N% Begrenzt die Höhe des fzf-Fensters auf N Prozent des Terminalfensters.
--query=SUCHE Startet die Suche direkt mit dem angegebenen Suchbegriff.
-f SUCH_MUSTER Filtert die Eingabe nicht-interaktiv (für Skripte). Ähnlich wie grep, aber unscharf.
--preview 'BEFEHL' Zeigt eine Vorschau des aktuell ausgewählten Elements an, wie mit cat {}.

So weit die Theorie 📖

Praktische Beispiele

Lass uns jetzt wichtige Use-Cases von fzf anschauen, die dich definitiv zu einem effektiveren Linux-Nerd machen werden 😄

Befehlshistorie history filtern

Vielleicht willst du einen Befehl erneut ausführen. Du kannst history | grep 'suchbegriff' verwenden. Aber dann wird nur etwas ausgespuckt, wenn dein 'suchbegriff' genau so vorkommt. und vielleicht musst du das öfter wiederholen. Das wird schnell lästig.

Besser kannst du eine Fuzzy-Suche auf deine bisherigen Befehle starten:

1
history | fzf

Details dazu hatten wir ja im weiter oben bereits.

Ordner wechseln

Bestimmt kennst du cd (nein, ich meine nicht die 💿) zum Wechsel in einen anderen Ordner.

Aber das geht auch als unscharfe (fuzzy) Aktion mit fzf. Mit einem speziellen Keybinding reicht:

1
cd **<TAB>

Wie geht es also genau? Hier sind die Schritte:

  1. Du gibst cd ** ein
  2. Drücke dann die [Tab]-Taste und [Enter]
  3. Jetzt öffnet fzf die Verzeichnis-Auswahl für dich
  4. Gib deinen Suchbegriff ein und drücke wieder [Enter]

So landest du im ausgewählten Ordner. Wenn nichts Passendes dabei ist, kannst du die Aktion auch wieder mit [Strg] und [C] abbrechen.

Hier habe ich zum Beispiel den Wechsel in einen Pfad innerhalb von /etc vorgenommen:

Probier es einfach aus. Das Keybinding ist nämlich meist voreingestellt, sodass es funktionieren wird.

Funktioniert das Keybinding cd ** nicht?

  1. führe echo 'eval "$(fzf --bash)"' >> ~/.bashrc aus
  2. und lies die Datei mit source ~/.bashrc danach neu ein

Dateien suchen und anzeigen

Auch mit find lässt sich fzf hervorragend verbinden für eine mächtige Dateisuche.

So suchst du zunächst nur Dateien, die du dann interaktiv filterst:

1
find . -type f | fzf

Datei-Vorschau anzeigen

Oft verwendet man head oder tail für eine Dateivorschau. Auch das kannst du mit fzf zusammen verwenden.

So siehst du dir die ersten 10 Zeilen einer Datei direkt in der Auswahl an, bevor du sie öffnest:

1
fzf --preview 'head {}'

Datei interaktiv auswählen und öffnen

Oft will man eine Datei nicht nur ansehen, sondern auch bearbeiten.

So öffnest du eine Datei interaktiv in deinem bevorzugten Editor:

1
nano $(fzf --height 40%)

Der Parameter height bestimmt dabei, wie hoch der Auswahlbereich für die Selektion der Datei ist.

Prozess beenden

Willst du einen Prozess beenden, so musst du meist erst die PID suchen und dann kill mit dieser Angabe und einem optionalen Signal für kill ausführen.

Auch das geht einfacher mit fzf. Finde und beende einen Prozess ohne mühsames Suchen der PID.

Starte zunächst einen harmlosen Dummy-Prozess im Hintergrund:

1
sleep 60 &

Jetzt lässt du dir alle Prozesse anzeigen:

1
kill **

Zum beenden suchst du nach sleep und drückst [Enter], um ihn vor Ablauf der 60 Sekunden zu beenden.

SSH-Hosts durchsuchen

Auch SSH-Verbindungen lassen sich mit fzf interaktiv aufbauen.

So durchsuchst du deine ~/.ssh/config und verbindest dich:

1
ssh $(grep -E '^Host [^*]' ~/.ssh/config | cut -d ' ' -f 2 | fzf)

Auch die Datei ~/.ssh/known_hosts könntest du in der gleichen Form verwenden. Das geht sogar super-duper am einfachsten 🆒

1
ssh **

Durch Git-History stöbern

Vielleicht arbeitest du auch mit git. Dann siehst du dir manchmal die Commits an. Danach kannst du zu dem gewünschten Eintrag die Details aufrufen.

Eine übersichtliche Git-History und Details zu einem Eintrag kannst du auch mit fzf erhalten:

1
git log --oneline | fzf --preview 'git show --name-only {1}'

Fazit

fzf revolutioniert deine Produktivität 🚀 in der Arbeit mit der Shell. Es verwandelt mühsames Suchen in einen schnellen, intuitiven Dialog mit deinem Rechner.

Verwende fzf in deine täglichen Aufgaben und du wirst dich fragen, wie du jemals ohne es auskommen konntest.

Cheat Sheet für fzf

Leg das neben deine Tastatur, wenn du es mit fzf ernst meinst 🔥

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# History filtern:
history | fzf
# Ordner wechseln:
cd **
# Dateien suchen:
find . -type f | fzf
# Datei-Vorschau:
fzf --preview 'head {}'
fzf --preview 'tail -3 {}'
# Datei öffnen:
nano $(fzf --height 40%)
vi $(fzf --height 40%)
# Pfad mit Fuzzy-Vervollständigung:
vim ordner/**
# Prozess beenden:
kill **
kill -9 **
# SSH-Hosts suchen:
ssh **
# Git-Log ansehen:
git log --oneline | fzf --preview 'git show --name-only {1}'

Hilfe zu fzf

Mehr zu fzf und all seinen Optionen findest du unter:

1
2
3
4
5
6
# kurze Übersicht:
tldr fzf 
# komplette Hilfe:
man fzf
# auch möglich:
fzf --help

Auf der Projektseite findest du weitere ausführliche Dokumentation, Beispiele und Anleitungen.

Details zum Befehl tldr gibt es hier.

Erstellt mit Hugo
Theme Stack gestaltet von Jimmy