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.

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.

Grundlegende Suche

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

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.

find . -maxdepth 2

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

find . -mindepth 2

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

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).

find . -name '*.js'

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

find . -iname '*.jpg'

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

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

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

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

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

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

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

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

Suche nach Typ

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

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

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

find . -type d -name 'node_modules'

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

find /usr/bin -type l

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

find /tmp -type f -empty

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

find . -type d -empty

Suche nach Größe

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

find / -size +100M

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

find . -size -10k

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

find . -size 0c

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

find / -type f -size +1G

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

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.

find . -mtime -7

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

find /var/log -mtime +30

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

find . -mmin -60

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

find . -atime -7

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

find . -ctime -1

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

find . -newer /tmp/timestamp.txt

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

find . -newermt '2025-01-01'

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

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

Suche nach Rechten & Eigentümer

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

find . -perm 644

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

find . -perm -u+x

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

find . -perm /o+w

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

find /home -user www-data

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

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.

find /usr -perm -4000 -type f

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

find /usr -perm -2000 -type f

Aktionen

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

find . -name '*.log' -print

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

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

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

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

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

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.

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

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

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

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

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

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

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).

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

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

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

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

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

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

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

Ausgabe & Formatierung

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

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

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

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.

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.

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.

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.

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.

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.

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.

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.

Verwandte Kommandos

  • grep – durchsucht Dateiinhalte nach Mustern und regulären Ausdrücken
  • xargs – baut aus der Ausgabe von find Befehlszeilen und führt sie aus
  • ls – listet Verzeichnisinhalte mit Details zu Rechten und Größe auf