# find — Dateien und Verzeichnisse im Verzeichnisbaum suchen

> Praxis-Guide zu find: Dateien und Verzeichnisse nach Name, Typ, Größe, Zeit und Rechten suchen und gefundene Treffer direkt weiterverarbeiten.

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

<!-- PROSE:intro -->
find durchsucht ganze Verzeichnisbäume und filtert Dateien und Verzeichnisse nach Name, Typ, Größe, Zeitstempel, Rechten und vielem mehr – und arbeitet mit den Treffern direkt weiter. Statt nur Pfade auszugeben, hängst du über `-exec`, `-delete` oder eine Pipe zu `xargs` beliebige Aktionen an. Genau hier liegt die Schärfe des Werkzeugs: `find … -delete` und `find … -exec rm` löschen rekursiv und unwiderruflich – teste deshalb jede destruktive Suche zuerst mit `-print`. Bei Dateinamen mit Leerzeichen oder Sonderzeichen sicherst du dich mit `-print0 | xargs -0` oder `-exec … {} +` ab. Dieser Guide zeigt dir die Ausdrücke, die du im Alltag wirklich brauchst – von der einfachen Namenssuche bis zur gefilterten Massenverarbeitung.
<!-- PROSE:intro:end -->

## Grundlegende Suche

`find <path>` — Listet alle Dateien und Verzeichnisse rekursiv unterhalb des angegebenen Pfads auf.

```bash
find /home/user/projects/
```

`find .` — Listet alle Dateien und Verzeichnisse rekursiv unterhalb des aktuellen Verzeichnisses auf.

`find <path> -maxdepth <n>` — Begrenzt die Suchtiefe auf n Ebenen unterhalb des Startpunkts.

```bash
find . -maxdepth 2
```

`find <path> -mindepth <n>` — Überspringt die ersten n Ebenen und liefert nur tiefer liegende Treffer.

```bash
find . -mindepth 2
```

`find <path1> <path2>` — Sucht in mehreren Verzeichnissen gleichzeitig.

```bash
find /var/log /tmp -name '*.log'
```

## Suche nach Name

`find <path> -name '<pattern>'` — Findet Dateien, die auf ein Namensmuster passen (Groß-/Kleinschreibung beachtet, mit Wildcards).

```bash
find . -name '*.js'
```

`find <path> -iname '<pattern>'` — Findet Dateien anhand eines Namensmusters (ohne Beachtung der Groß-/Kleinschreibung).

```bash
find . -iname '*.jpg'
```

`find <path> -name '<pattern>' -not -name '<pattern>'` — Findet Dateien, die auf ein Muster passen, aber nicht auf ein anderes.

```bash
find . -name '*.js' -not -name '*.min.js'
```

`find <path> -path '<pattern>'` — Vergleicht mit dem gesamten Pfad, nicht nur mit dem Dateinamen.

```bash
find . -path '*/src/*.ts'
```

`find <path> -regex '<pattern>'` — Findet Dateinamen über einen regulären Ausdruck (passt auf den gesamten Pfad).

```bash
find . -regex '.*\.(js\|ts)$'
```

`find <path> -iregex '<pattern>'` — Findet Dateinamen über einen regulären Ausdruck ohne Beachtung der Groß-/Kleinschreibung.

```bash
find . -iregex '.*\.jpe?g$'
```

## Suche nach Typ

`find <path> -type f` — Findet nur reguläre Dateien.

```bash
find /var/log -type f -name '*.log'
```

`find <path> -type d` — Findet nur Verzeichnisse.

```bash
find . -type d -name 'node_modules'
```

`find <path> -type l` — Findet nur symbolische Links.

```bash
find /usr/bin -type l
```

`find <path> -type f -empty` — Findet leere Dateien (null Bytes).

```bash
find /tmp -type f -empty
```

`find <path> -type d -empty` — Findet leere Verzeichnisse.

```bash
find . -type d -empty
```

## Suche nach Größe

`find <path> -size +<n>M` — Findet Dateien, die größer als n Megabyte sind.

```bash
find / -size +100M
```

`find <path> -size -<n>k` — Findet Dateien, die kleiner als n Kilobyte sind.

```bash
find . -size -10k
```

`find <path> -size <n>c` — Findet Dateien mit exakt n Bytes.

```bash
find . -size 0c
```

`find <path> -size +<n>G` — Findet Dateien, die größer als n Gigabyte sind.

```bash
find / -type f -size +1G
```

`find <path> -size +<min>M -size -<max>M` — Findet Dateien innerhalb eines Größenbereichs.

```bash
find . -type f -size +10M -size -100M
```

## Suche nach Zeit

`find <path> -mtime -<n>` — Findet Dateien, die in den letzten n Tagen geändert wurden.

```bash
find . -mtime -7
```

`find <path> -mtime +<n>` — Findet Dateien, die vor mehr als n Tagen geändert wurden.

```bash
find /var/log -mtime +30
```

`find <path> -mmin -<n>` — Findet Dateien, die in den letzten n Minuten geändert wurden.

```bash
find . -mmin -60
```

`find <path> -atime -<n>` — Findet Dateien, auf die in den letzten n Tagen zugegriffen wurde.

```bash
find . -atime -7
```

`find <path> -ctime -<n>` — Findet Dateien, deren Status (Metadaten) in den letzten n Tagen geändert wurde.

```bash
find . -ctime -1
```

`find <path> -newer <reference>` — Findet Dateien, die neuer sind als eine Referenzdatei.

```bash
find . -newer /tmp/timestamp.txt
```

`find <path> -newermt '<date>'` — Findet Dateien, die nach einem bestimmten Datum geändert wurden (GNU find).

```bash
find . -newermt '2025-01-01'
```

`find <path> -not -newermt '<date>'` — Findet Dateien, die vor einem bestimmten Datum geändert wurden.

```bash
find . -type f -not -newermt '2024-06-01'
```

## Suche nach Rechten & Eigentümer

`find <path> -perm <mode>` — Findet Dateien mit exakt den angegebenen Rechten.

```bash
find . -perm 644
```

`find <path> -perm -<mode>` — Findet Dateien, bei denen alle angegebenen Rechte-Bits gesetzt sind.

```bash
find . -perm -u+x
```

`find <path> -perm /<mode>` — Findet Dateien, bei denen eines der angegebenen Rechte-Bits gesetzt ist.

```bash
find . -perm /o+w
```

`find <path> -user <username>` — Findet Dateien, die einem bestimmten Benutzer gehören.

```bash
find /home -user www-data
```

`find <path> -group <groupname>` — Findet Dateien, die zu einer bestimmten Gruppe gehören.

```bash
find /var -group staff
```

`find <path> -nouser` — Findet Dateien, die keinem bekannten Benutzer gehören.

`find <path> -nogroup` — Findet Dateien, die zu keiner bekannten Gruppe gehören.

`find <path> -perm -4000` — Findet Dateien mit gesetztem SUID-Bit.

```bash
find /usr -perm -4000 -type f
```

`find <path> -perm -2000` — Findet Dateien mit gesetztem SGID-Bit.

```bash
find /usr -perm -2000 -type f
```

## Aktionen

`find <path> <expression> -print` — Gibt den vollständigen Pfad jedes Treffers aus (Standardaktion).

```bash
find . -name '*.log' -print
```

`find <path> <expression> -print0` — Gibt Treffer durch ein Null-Zeichen getrennt aus (sicher für Dateinamen mit Leerzeichen).

```bash
find . -name '*.txt' -print0 | xargs -0 wc -l
```

`find <path> <expression> -ls` — Gibt Treffer im Format von ls -l mit detaillierten Dateiinfos aus.

```bash
find /tmp -type f -mtime -1 -ls
```

`find <path> <expression> -delete` — Löscht alle passenden Dateien (mit Vorsicht verwenden, vorher mit -print testen).

```bash
find /tmp -type f -name '*.tmp' -mtime +7 -delete
```

`find <path> <expression> -exec <command> {} \;` — Führt für jeden Treffer einen Befehl aus. {} wird durch den Dateinamen ersetzt.

```bash
find . -name '*.log' -exec rm {} \;
```

`find <path> <expression> -exec <command> {} +` — Führt einen Befehl mit allen Treffern als Argumente aus (schneller als \;).

```bash
find . -name '*.txt' -exec grep -l 'TODO' {} +
```

`find <path> <expression> -execdir <command> {} \;` — Führt einen Befehl im Verzeichnis jedes Treffers aus (sicherer als -exec).

```bash
find . -name '*.bak' -execdir rm {} \;
```

`find <path> <expression> -ok <command> {} \;` — Wie -exec, fragt aber vor jeder Ausführung nach Bestätigung.

```bash
find . -name '*.tmp' -ok rm {} \;
```

## Logische Operatoren

`find <path> -name '<a>' -and -name '<b>'` — Trifft auf Dateien zu, die beide Bedingungen erfüllen (UND, Standard bei Aneinanderreihung).

```bash
find . -name '*.js' -and -size +100k
```

`find <path> -name '<a>' -or -name '<b>'` — Trifft auf Dateien zu, die eine der Bedingungen erfüllen (ODER).

```bash
find . -name '*.jpg' -or -name '*.png'
```

`find <path> -not <expression>` — Negiert einen Ausdruck (NICHT).

```bash
find . -type f -not -name '*.log'
```

`find <path> \( <expr1> -or <expr2> \) -and <expr3>` — Gruppiert Ausdrücke mit maskierten Klammern, um die Auswertungsreihenfolge festzulegen.

```bash
find . \( -name '*.js' -or -name '*.ts' \) -and -size +10k
```

## Ausgabe & Formatierung

`find <path> -printf '<format>'` — Gibt Treffer in einem eigenen Format aus (GNU find).

```bash
find . -type f -printf '%s %p\n'
```

`find <path> -printf '%T+ %p\n'` — Gibt Änderungszeit und Pfad jeder Datei aus.

```bash
find . -type f -printf '%T+ %p\n' | sort -r | head -20
```

`find <path> -printf '%s\t%p\n'` — Gibt Dateigröße (Bytes) und Pfad tab-getrennt aus.

```bash
find . -type f -printf '%s\t%p\n' | sort -rn | head -10
```

`find <path> -fprintf <file> '<format>'` — Schreibt formatierte Ausgabe in eine Datei statt nach stdout.

```bash
find /var/log -type f -fprintf /tmp/logfiles.txt '%p\n'
```

## Verzeichnisse ausschließen

`find <path> -name '<dir>' -prune -o <expression> -print` — Schließt ein Verzeichnis mit -prune von der Suche aus.

```bash
find . -name 'node_modules' -prune -o -name '*.js' -print
```

`find <path> -path '<pattern>' -prune -o <expression> -print` — Schließt Verzeichnisse aus, die auf ein Pfadmuster passen.

```bash
find . -path './.git' -prune -o -type f -print
```

`find <path> \( -name '<a>' -o -name '<b>' \) -prune -o <expression> -print` — Schließt mehrere Verzeichnisse von der Suche aus.

```bash
find . \( -name 'node_modules' -o -name '.git' \) -prune -o -type f -name '*.ts' -print
```

## Praktische Beispiele

`find . -type f -name '*.log' -mtime +30 -delete` — Löscht Logdateien, die älter als 30 Tage sind.

`find . -type f -name '*.php' -exec grep -l '<pattern>' {} +` — Findet PHP-Dateien, die eine bestimmte Zeichenkette enthalten.

```bash
find . -type f -name '*.php' -exec grep -l 'TODO' {} +
```

`find . -type f -exec chmod 644 {} +` — Setzt die Rechte aller regulären Dateien auf 644.

`find . -type d -exec chmod 755 {} +` — Setzt die Rechte aller Verzeichnisse auf 755.

`find . -type f -name '*.txt' -print0 | xargs -0 tar -czf texts.tar.gz` — Erstellt ein tar-Archiv aller .txt-Dateien (verarbeitet Leerzeichen in Namen korrekt).

`find . -type f -printf '%s\t%p\n' | sort -rn | head -20` — Findet die 20 größten Dateien in einem Verzeichnisbaum.

`find . -type f -name '*.jpg' -exec cp {} /backup/images/ \;` — Kopiert alle JPEG-Dateien in ein Backup-Verzeichnis.

`find . -maxdepth 1 -type f -name '*.bak' -exec mv {} {}.old \;` — Benennt alle .bak-Dateien im aktuellen Verzeichnis um, indem .old angehängt wird.

`find . -name '*.orig' -o -name '*.bak' -o -name '*~' | xargs rm -f` — Entfernt gängige Backup- und temporäre Dateien.

`find /var/log -type f -size +50M -exec ls -lh {} +` — Listet große Logdateien mit menschenlesbaren Größen auf.

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

find ist eines der mächtigsten Werkzeuge der Kommandozeile: Mit kombinierbaren Tests nach Name, Typ, Größe, Zeit und Rechten grenzt du auch riesige Verzeichnisbäume präzise ein und verarbeitest die Treffer in einem Rutsch weiter. Dieselbe Mächtigkeit macht find aber gefährlich – `-delete` und `-exec rm … {} +` löschen rekursiv und ohne Rückfrage; teste jede destruktive Suche zuerst mit `-print` und nutze bei Dateinamen mit Leerzeichen konsequent `-print0 | xargs -0` oder `-exec … {} +` statt einer einfachen Pipe. Beachte außerdem, dass `-printf`/`-fprintf`, `-regex` und `-newermt` GNU-Erweiterungen sind: Das `find` auf macOS und BSD kennt `-printf` nicht und verhält sich bei einigen Optionen anders.

## Weiterführende Links

- [ubuntuusers-Wiki: find](https://wiki.ubuntuusers.de/find/) – ausführliche deutschsprachige Anleitung zur Dateisuche mit find
- [GNU-Findutils-Handbuch](https://www.gnu.org/software/findutils/manual/html_mono/find.html) – vollständige offizielle Referenz aller find-Optionen (englisch)
<!-- PROSE:outro:end -->

## Verwandte Kommandos

- [grep](https://www.jpkc.com/db/cheatsheets/files-text/grep/) – durchsucht Dateiinhalte nach Mustern und regulären Ausdrücken
- [xargs](https://www.jpkc.com/db/cheatsheets/files-text/xargs/) – baut aus der Ausgabe von find Befehlszeilen und führt sie aus
- [ls](https://www.jpkc.com/db/cheatsheets/files-text/ls/) – listet Verzeichnisinhalte mit Details zu Rechten und Größe auf

