# fzf — Interaktiver Fuzzy-Finder für die Kommandozeile

> Praxis-Guide zu fzf: interaktiv durch Dateien, History, Prozesse und Git-Branches fuzzy-suchen und auswählen – direkt im Terminal.

Source: https://www.jpkc.com/db/cheatsheets/files-text/fzf/

<!-- PROSE:intro -->
fzf ist ein interaktiver Fuzzy-Finder für die Kommandozeile: Du tippst ein paar Zeichen, und fzf filtert in Echtzeit aus beliebigen Listen – Dateien, Befehls-History, Prozessen, Git-Branches und allem, was du hineinpipest. Damit verwandelst du langwierige Tipparbeit in ein paar Tastenanschläge mit Live-Vorschau und Mehrfachauswahl. Beachte, dass fzf Drittsoftware ist und nicht zum Standardumfang gehört – du installierst es separat (etwa über den Paketmanager oder das Git-Repository) und richtest danach die Shell-Integration ein, damit `Ctrl+T`, `Ctrl+R`, `Alt+C` und der `**`-Trigger funktionieren. Dieser Guide zeigt dir die Aufrufe und Tastaturkürzel, mit denen du fzf im Alltag wirklich nutzt – von der einfachen Suche bis zu Git- und Prozess-Workflows.
<!-- PROSE:intro:end -->

## Grundlagen

`fzf` — Startet den Fuzzy-Finder über alle Dateien im aktuellen Verzeichnis (rekursiv).

```bash
fzf
```

`<command> | fzf` — Pipet eine beliebige Liste in fzf zur interaktiven Auswahl.

```bash
ls -la | fzf
```

`fzf --query '<string>'` — Startet mit einer voreingestellten Suchanfrage.

```bash
fzf --query 'config'
```

`fzf --filter '<string>'` — Nicht-interaktiver Filtermodus (für Skripte).

```bash
find . -name '*.py' | fzf --filter 'test'
```

`fzf --multi` — Aktiviert die Mehrfachauswahl (Tab zum Auswählen, Enter zum Bestätigen).

```bash
fzf --multi
```

`fzf --select-1` — Wählt automatisch aus, wenn es nur einen Treffer gibt.

```bash
fzf --select-1 --query 'unique-name'
```

`fzf --exit-0` — Beendet sofort, wenn es keine Treffer gibt.

```bash
fzf --exit-0 --query 'nonexistent'
```

## Suchsyntax

`abc` — Fuzzy-Treffer: Einträge, die a, b, c in dieser Reihenfolge enthalten.

```bash
'cfg' findet 'config', 'configuration'
```

`'<exact>` — Exakter Treffer (mit einfachem Anführungszeichen voranstellen).

```bash
'config findet nur Zeilen, die 'config' wörtlich enthalten
```

`^<prefix>` — Präfix-Treffer: muss mit der Zeichenkette beginnen.

```bash
^src/ findet Zeilen, die mit 'src/' beginnen
```

`<suffix>$` — Suffix-Treffer: muss mit der Zeichenkette enden.

```bash
.json$ findet Zeilen, die auf '.json' enden
```

`!<term>` — Negativ-Treffer: schließt Zeilen aus, die auf den Begriff passen.

```bash
!test schließt Zeilen mit 'test' aus
```

`<term1> | <term2>` — ODER-Operator: passt auf einen der beiden Begriffe.

```bash
.js$ | .ts$ findet JavaScript- oder TypeScript-Dateien
```

`<term1> <term2>` — UND-Operator: passt auf beide Begriffe (durch Leerzeichen getrennt).

```bash
src config findet Zeilen, die 'src' und 'config' enthalten
```

## Vorschau & Anzeige

`fzf --preview '<command> {}'` — Zeigt eine Vorschau des ausgewählten Eintrags.

```bash
fzf --preview 'cat {}'
```

`fzf --preview 'bat --color=always {}'` — Vorschau mit Syntaxhervorhebung (benötigt bat).

```bash
fzf --preview 'bat --color=always --line-range=:100 {}'
```

`fzf --preview-window <position>` — Legt die Position der Vorschau fest (up, down, left, right, hidden).

```bash
fzf --preview 'cat {}' --preview-window right:60%
```

`fzf --height <percent>` — Begrenzt fzf auf einen Teil des Bildschirms (kein Vollbild).

```bash
fzf --height 40%
```

`fzf --layout reverse` — Zeigt die Ergebnisse von oben nach unten statt von unten nach oben.

```bash
fzf --layout reverse --height 40%
```

`fzf --border` — Zeichnet einen Rahmen um das fzf-Fenster.

```bash
fzf --border rounded --height 40%
```

## Shell-Integration (Ctrl-Kürzel)

`Ctrl+T` — Findet Dateien per Fuzzy-Suche und fügt die Auswahl in die Befehlszeile ein.

```bash
vim [Ctrl+T] → Datei wählen → Enter
```

`Ctrl+R` — Durchsucht die Befehls-History der Shell per Fuzzy-Suche.

```bash
[Ctrl+R] → Teilbefehl eingeben → Enter zum Ausführen
```

`Alt+C` — Findet Verzeichnisse per Fuzzy-Suche und wechselt in die Auswahl (cd).

```bash
[Alt+C] → Verzeichnis wählen → Enter
```

`<command> **<Tab>` — Löst die Fuzzy-Vervollständigung aus (Dateien, Verzeichnisse, Hosts usw.).

```bash
vim **[Tab] → Datei per Fuzzy-Suche wählen
```

`cd **<Tab>` — Fuzzy-Vervollständigung für Verzeichnisse.

```bash
cd **[Tab] → Verzeichnis wählen
```

`ssh **<Tab>` — Fuzzy-Vervollständigung für Hostnamen aus known_hosts.

```bash
ssh **[Tab] → Host wählen
```

## Git-Integration

`git branch | fzf | xargs git checkout` — Wählt interaktiv einen Branch aus und checkt ihn aus.

```bash
git branch | fzf | xargs git checkout
```

`git log --oneline | fzf --preview 'git show {1}'` — Durchstöbert Commits mit Vorschau.

```bash
git log --oneline | fzf --preview 'git show {1}'
```

`git diff --name-only | fzf --preview 'git diff {}'` — Durchstöbert geänderte Dateien mit Diff-Vorschau.

```bash
git diff --name-only | fzf --multi --preview 'git diff {}'
```

`git stash list | fzf | cut -d: -f1 | xargs git stash pop` — Wählt interaktiv einen Stash aus und wendet ihn an (pop).

```bash
git stash list | fzf | cut -d: -f1 | xargs git stash pop
```

## Häufige Muster

`vim $(fzf)` — Findet eine Datei und öffnet sie in vim.

```bash
vim $(fzf --preview 'cat {}')
```

`kill -9 $(ps aux | fzf | awk '{print $2}')` — Wählt interaktiv einen Prozess aus und beendet ihn.

```bash
kill -9 $(ps aux | fzf | awk '{print $2}')
```

`docker stop $(docker ps | fzf | awk '{print $1}')` — Wählt interaktiv einen Docker-Container aus und stoppt ihn.

```bash
docker stop $(docker ps | fzf | awk '{print $1}')
```

`printenv | fzf` — Durchsucht und durchstöbert Umgebungsvariablen.

```bash
printenv | fzf
```

`cat <file> | fzf --multi | pbcopy` — Wählt Zeilen aus einer Datei aus und kopiert sie in die Zwischenablage.

```bash
cat urls.txt | fzf --multi | pbcopy
```

`find . -name '*.json' | fzf --preview 'cat {}' | xargs code` — Findet, zeigt eine Vorschau und öffnet eine JSON-Datei in VS Code.

```bash
find . -name '*.json' | fzf --preview 'cat {}' | xargs code
```

## Umgebungsvariablen

`FZF_DEFAULT_COMMAND='<cmd>'` — Legt den Standardbefehl für die Dateiauflistung fest.

```bash
export FZF_DEFAULT_COMMAND='fd --type f --hidden --exclude .git'
```

`FZF_DEFAULT_OPTS='<opts>'` — Legt die Standardoptionen für fzf fest.

```bash
export FZF_DEFAULT_OPTS='--height 40% --layout reverse --border'
```

`FZF_CTRL_T_COMMAND='<cmd>'` — Passt die Dateisuche für Ctrl+T an.

```bash
export FZF_CTRL_T_COMMAND='fd --type f --hidden'
```

`FZF_ALT_C_COMMAND='<cmd>'` — Passt die Verzeichnissuche für Alt+C an.

```bash
export FZF_ALT_C_COMMAND='fd --type d --hidden'
```

<!-- PROSE:outro -->
## Fazit

fzf macht das Suchen und Auswählen im Terminal radikal schneller: Du tippst unscharf, siehst sofort die Treffer und kombinierst die Auswahl per Pipe mit jedem anderen Werkzeug – von `vim $(fzf)` bis zum interaktiven Branch-Wechsel in Git. Da fzf Drittsoftware ist, musst du es einmalig installieren und die Shell-Integration aktivieren; erst danach stehen die Kürzel `Ctrl+T`, `Ctrl+R`, `Alt+C` und der `**`-Vervollständigungstrigger zur Verfügung, und manche Beispiele setzen weitere Helfer wie `fd`, `bat` oder `pbcopy` voraus. Sei bei Kombinationen wie `… | fzf | xargs git checkout` oder `kill -9 $(…)` aufmerksam: fzf liefert nur die Auswahl, die Wirkung kommt vom nachgeschalteten Befehl – prüfe also, was du nach der Auswahl wirklich ausführst.

## Weiterführende Links

- [fzf auf GitHub](https://github.com/junegunn/fzf) – offizielles Projekt mit Installation, Doku und Beispielen (englisch)
- [fzf-Wiki: Examples](https://github.com/junegunn/fzf/wiki/examples) – umfangreiche Sammlung praktischer Anwendungsbeispiele (englisch)
<!-- PROSE:outro:end -->

## Verwandte Kommandos

- [grep](https://www.jpkc.com/db/cheatsheets/files-text/grep/) – durchsucht Dateiinhalte nach Mustern; gut als Vorfilter vor fzf
- [find](https://www.jpkc.com/db/cheatsheets/files-text/find/) – liefert Dateilisten, die du per Pipe an fzf übergibst
- [less](https://www.jpkc.com/db/cheatsheets/files-text/less/) – Pager zum Anzeigen der mit fzf ausgewählten Datei

