Der Befehl find in Linux: Dateien nach Name, Größe und Datum suchen mit Beispielen
Der Befehl find durchläuft einen Verzeichnisbaum und wählt Dateien nach Bedingungen aus: find /pfad -name '*.log' sucht nach dem Namen, -type f nur Dateien, -size +100M größer als 100 MB, -mtime -7 innerhalb der letzten Woche geändert. Bedingungen lassen sich kombinieren, und auf die Treffer können Sie mit -exec, -delete anwenden oder eine Liste an xargs übergeben.
Der Befehl find durchläuft einen Verzeichnisbaum und findet Dateien nach Bedingungen: Name, Typ, Größe, Änderungsdatum, Besitzer und Rechte. Das allgemeine Schema lautet find [wo suchen] [Bedingungen] [Aktion]. Im Folgenden finden Sie find-linux-beispiele für typische Aufgaben: eine Konfigurationsdatei finden, alte Logs aufräumen oder herausfinden, was den Speicherplatz belegt.
Syntax des Befehls find
find /var/log -type f -name '*.log' -mtime +30 -print
Zerlegt in Teile:
/var/log— Startpunkt. Sie können mehrere Verzeichnisse nacheinander angeben oder.(das aktuelle Verzeichnis). Ohne Pfad sucht GNU find im aktuellen Verzeichnis.-type f -name '*.log' -mtime +30— Bedingungen (in der Dokumentation „Tests“ genannt). Zwischen ihnen gilt standardmäßig ein logisches UND.-print— die Aktion: den Pfad ausgeben. Sie wird automatisch eingesetzt, wenn keine andere Aktion angegeben ist.
find arbeitet rekursiv und durchsucht alle Unterverzeichnisse. Starten Sie es als normaler Benutzer auf Systempfaden, füllen Meldungen wie Permission denied die Ausgabe. Leiten Sie den Fehlerstrom um, um sie loszuwerden:
find / -name 'nginx.conf' 2>/dev/null
Suche nach Name: -name und -iname
Die Bedingung -name vergleicht nur den Dateinamen (ohne Pfad) mit einem Muster. Das Muster unterstützt * (beliebige Zeichen), ? (ein Zeichen) und [abc] (eines der angegebenen Zeichen).
# genauer Name
find /etc -name 'hosts'
# alle .conf-Dateien
find /etc -name '*.conf'
# ohne Beachtung der Groß- und Kleinschreibung: README.md, readme.MD, Readme.md
find ~/projects -iname 'readme.md'
# report_1.csv ... report_9.csv
find . -name 'report_?.csv'
Setzen Sie das Muster immer in Anführungszeichen. Ohne sie expandiert die Shell *.conf anhand der Dateien im aktuellen Verzeichnis, und find erhält eine Liste von Namen statt eines Musters. Das Ergebnis ist dann unerwartet oder der Befehl bricht mit der Meldung paths must precede expression ab.
Suche nach Pfad: -path und -regex
Ist das Verzeichnis wichtig und nicht nur der Name, verwenden Sie -path. Es vergleicht das Muster mit dem gesamten Pfad:
# .js-Dateien nur innerhalb von src-Verzeichnissen
find . -path '*/src/*' -name '*.js'
Für komplexe Muster gibt es -regex (ein regulärer Ausdruck, ebenfalls über den vollständigen Pfad) und -iregex ohne Beachtung der Groß- und Kleinschreibung:
find . -regextype posix-extended -regex '.*\.(jpg|jpeg|png)$'
Ein Verzeichnis ausschließen
Damit find zum Beispiel nicht in node_modules oder .git absteigt, verwenden Sie -prune:
find . -path ./node_modules -prune -o -name '*.js' -print
Gelesen heißt das: „Wenn der Pfad ./node_modules ist, nicht hineingehen, sonst (-o) die Dateien *.js ausgeben.“ Das abschließende -print ist nötig, sonst erscheint auch das ausgeschlossene Verzeichnis selbst in der Ausgabe. Einfacher, aber langsamer ist -not -path '*/node_modules/*': find durchläuft das Verzeichnis trotzdem und filtert nur das Ergebnis.
Suche nach Typ: -type
| Wert | Was gesucht wird |
|---|---|
-type f | normale Dateien |
-type d | Verzeichnisse |
-type l | symbolische Links |
-type s | Sockets |
-type p | benannte Pipes (FIFO) |
# nur Verzeichnisse mit dem Namen logs
find / -type d -name 'logs' 2>/dev/null
# leere Dateien und leere Verzeichnisse
find . -type f -empty
find . -type d -empty
# defekte symbolische Links
find . -xtype l
Suche nach Größe: -size
Die Bedingung -size nimmt eine Zahl mit Suffix: c — Bytes, k — Kilobyte, M — Megabyte, G — Gigabyte. Das Zeichen + bedeutet „größer“, - „kleiner“, ohne Zeichen „genau“.
# Dateien größer als 100 MB im ganzen System
find / -type f -size +100M 2>/dev/null
# zwischen 10 und 50 MB
find . -type f -size +10M -size -50M
# kleiner als 1 KB
find . -type f -size -1k
Dabei gibt es eine Besonderheit: Die Größe wird auf die gewählte Einheit aufgerundet. Deshalb findet -size -1M nur leere Dateien, denn jede nicht leere Datei belegt nach dem Aufrunden „mindestens 1 Megabyte“. Für genaue Grenzen verwenden Sie kleinere Einheiten: -size -1024k.
Was belegt den Speicherplatz?
Die Kombination aus find, ls und sort zeigt die größten Dateien:
find /var -type f -size +50M -exec ls -lh {} + 2>/dev/null | sort -k5 -rh | head
-rw-r----- 1 syslog adm 1.2G Oct 14 09:12 /var/log/syslog.1
-rw-r--r-- 1 root root 412M Oct 10 03:00 /var/backups/db.sql.gz
-rw-r----- 1 root adm 96M Oct 14 09:15 /var/log/nginx/access.log
Für die Größe ganzer Verzeichnisse ist du -sh besser geeignet. find lohnt sich, wenn eine einzelne riesige Datei irgendwo in der Tiefe den Platz belegt.
Suche nach Datum: -mtime, -mmin, -newer
Jede Datei hat drei Zeitstempel, und find kann nach jedem davon filtern:
| Bedingung | Zeitstempel | Einheit |
|---|---|---|
-mtime / -mmin | Änderung des Inhalts | Tage / Minuten |
-atime / -amin | letzter Lesezugriff | Tage / Minuten |
-ctime / -cmin | Änderung der Metadaten (Rechte, Besitzer, Name) | Tage / Minuten |
Die Vorzeichen funktionieren wie bei der Größe: -mtime -7 — vor weniger als 7 Tagen geändert, -mtime +30 — vor mehr als 30 Tagen geändert.
# in der letzten Woche geändert
find ~/projects -type f -mtime -7
# Logs älter als 30 Tage
find /var/log -type f -name '*.log' -mtime +30
# in den letzten 15 Minuten geändert
find /etc -type f -mmin -15
Tage werden als volle Zeiträume zu 24 Stunden gezählt, der Rest wird abgeschnitten. Deshalb findet -mtime +1 Dateien, die älter als 48 Stunden sind, nicht 24 — eine häufige Falle. Wenn Sie genau sein müssen, rechnen Sie in Minuten: -mmin +1440.
Dateien neuer als eine andere Datei oder ein Datum
# geändert, nachdem deploy.lock geändert wurde
find . -type f -newer deploy.lock
# geändert nach einem bestimmten Datum (GNU find)
find . -type f -newermt '2026-10-01'
# innerhalb eines Zeitraums
find . -type f -newermt '2026-10-01' ! -newermt '2026-10-08'
Suche nach Besitzer und Rechten
# Dateien des Benutzers alice
find /home -user alice
# Dateien ohne existierenden Besitzer (nach dem Löschen eines Benutzers)
find / -nouser 2>/dev/null
# Dateien mit genau den Rechten 777
find /var/www -type f -perm 777
# Dateien, die alle beschreiben dürfen
find /var/www -perm -o=w
# Dateien mit gesetztem SUID-Bit — nützlich bei Sicherheitsprüfungen
find / -perm -4000 -type f 2>/dev/null
Bei -perm gibt es drei Formen: ohne Zeichen müssen die Rechte exakt übereinstimmen, mit - müssen mindestens alle angegebenen Bits gesetzt sein, mit / mindestens eines davon.
Logik der Bedingungen: UND, ODER, NICHT
Bedingungen werden standardmäßig mit „UND“ verknüpft. Für „ODER“ dient -o, für die Verneinung ! oder -not. Gruppiert wird mit Klammern, die Sie vor der Shell schützen müssen:
# JPG- oder PNG-Bilder
find . -type f \( -name '*.jpg' -o -name '*.png' \)
# alles außer .tmp-Dateien
find . -type f ! -name '*.tmp'
Ohne Klammern bezöge sich -type f nur auf die erste Bedingung des ODER-Paares, und Verzeichnisse mit dem Namen *.png landeten im Ergebnis. Die Leerzeichen um \( und \) sind Pflicht.
Suchtiefe: -maxdepth und -mindepth
# nur im aktuellen Verzeichnis, ohne Unterverzeichnisse
find . -maxdepth 1 -type f -name '*.sh'
# ab der zweiten Verschachtelungsebene
find . -mindepth 2 -name '*.md'
# nicht auf andere Dateisysteme wechseln
find / -xdev -type f -size +1G
Setzen Sie -maxdepth direkt nach dem Pfad und vor die übrigen Bedingungen, sonst gibt GNU find eine Warnung aus. Die Option -xdev ist bei der Suche ab / nützlich: find betritt dann weder /proc noch Netzwerk- oder eingehängte Laufwerke nicht.
Aktionen mit den Treffern: -exec, -delete, xargs
-exec: einen Befehl für jede Datei ausführen
Anstelle von {} setzt find den Pfad der Datei ein. Der Befehl endet mit \; oder +:
# einen Aufruf pro Datei
find . -name '*.sh' -exec chmod +x {} \;
# alle Dateien in einer Liste — schneller
find . -name '*.log' -exec gzip {} +
# mit Nachfrage für jede Datei
find . -name '*.bak' -ok rm {} \;
Die Variante mit + sammelt die Pfade in Gruppen und startet den Befehl deutlich seltener. Bei Tausenden Dateien ist sie um ein Vielfaches schneller. Die Variante mit \; brauchen Sie, wenn der Befehl nur eine Datei verarbeiten kann oder {} nicht am Ende steht.
-delete: Treffer löschen
# zuerst prüfen, was gelöscht würde
find /tmp/build -type f -name '*.o' -mtime +7
# dann löschen
find /tmp/build -type f -name '*.o' -mtime +7 -delete
Starten Sie den Befehl immer zuerst ohne -delete und prüfen Sie die Liste. Setzen Sie -delete als Letztes: find wertet den Ausdruck von links nach rechts aus, und find . -delete -name '*.o' löscht alles im Verzeichnis, bevor der Name überhaupt geprüft wird.
find und xargs
Die klassische Kombination ist, die Dateiliste über xargs an ein anderes Programm weiterzugeben. Damit Namen mit Leerzeichen nicht brechen, verwenden Sie das Null-Byte als Trenner:
find . -type f -name '*.txt' -print0 | xargs -0 wc -l
Die Option -P von xargs führt die Verarbeitung parallel aus:
find ./images -name '*.png' -print0 | xargs -0 -P 4 -n 10 optipng
find und grep: Text in Dateien suchen
find sucht Dateien, nicht deren Inhalt. Um eine Zeichenkette in den gefundenen Dateien zu suchen, übergeben Sie sie an grep:
# in welchen Konfigurationen steht listen 8080
find /etc/nginx -type f -name '*.conf' -exec grep -Hn 'listen 8080' {} +
/etc/nginx/sites-enabled/app.conf:4: listen 8080;
Die Option -H gibt den Dateinamen aus, -n die Zeilennummer, und grep -l zeigt nur die Namen der Dateien mit Treffer. Wenn Sie nur nach der Dateiendung filtern wollen, reicht grep allein: grep -rn --include='*.conf' 'listen 8080' /etc/nginx.
Eigenes Ausgabeformat: -printf
GNU find kann nicht nur den Pfad ausgeben. Zum Beispiel Größe, Datum und Name:
find . -maxdepth 1 -type f -printf '%s\t%TY-%Tm-%Td\t%p\n' | sort -n
Dabei steht %s für die Größe in Bytes, %T... für das Änderungsdatum in einzelnen Teilen und %p für den Pfad. Das ist praktisch für Skripte, weil Sie die Ausgabe von ls nicht auswerten müssen.
Spickzettel: find linux beispiele für jeden Tag
| Aufgabe | Befehl |
|---|---|
| Datei nach Name finden | find / -name 'datei.txt' 2>/dev/null |
| Ohne Beachtung der Groß- und Kleinschreibung | find . -iname '*.jpg' |
| Nur Verzeichnisse | find . -type d -name 'cache' |
| Dateien größer als 1 GB | find / -xdev -type f -size +1G |
| In den letzten 24 Stunden geändert | find . -type f -mtime -1 |
| In der letzten Stunde geändert | find . -type f -mmin -60 |
| Logs älter als 30 Tage löschen | find /var/log/app -name '*.log' -mtime +30 -delete |
| Leere Verzeichnisse | find . -type d -empty |
| Rechte aller Verzeichnisse ändern | find . -type d -exec chmod 755 {} + |
| Zeichenkette in Dateien | find . -name '*.py' -exec grep -l 'TODO' {} + |
| Dateien zählen | find . -type f | wc -l |
Typische Fehler
- Muster ohne Anführungszeichen.
find . -name *.logbricht, sobald im aktuellen Verzeichnis auch nur eine.log-Datei liegt. Schreiben Sie'*.log'. - Lawine aus Permission denied. Ergänzen Sie
2>/dev/nulloder starten Sie mitsudo, wenn wirklich die ganze Platte durchsucht werden soll. -deletean der falschen Stelle. Die Option gehört ans Ende, davor steht ein Probelauf ohne Löschen.- Namen mit Leerzeichen in der Pipeline.
find ... | xargs rmzerlegt „Meine Datei.txt“ in zwei Argumente. Verwenden Sie-print0undxargs -0oder-exec. - Genaue Tage von
-mtimeerwarten. Für exakte Zeiträume nehmen Sie-mminoder-newermt.
Fazit
find ist ein universelles Werkzeug zur Suche im Dateisystem: Pfad, Bedingungen nach Name, Typ, Größe, Datum und Rechten, dann eine Aktion. Beherrschen Sie die fünf Grundpfeiler -name, -type, -size, -mtime und -exec ... +, dann lösen Sie die meisten Aufgaben mit einer Zeile. Probieren Sie die find-linux-beispiele in Ihrem Terminal aus. Die Verbindung von find mit grep, sed und awk behandeln wir praktisch in der Lektion zur Textverarbeitung im Linux-Kurs.
Häufige Fragen
Worin unterscheidet sich find von locate?
locate sucht in einer vorab erstellten Datenbank von Namen. Das ist sofort fertig, sieht aber keine Dateien, die nach der letzten Aktualisierung der Datenbank mit updatedb entstanden sind. find durchsucht das Laufwerk in Echtzeit und kann nach Größe, Datum und Rechten filtern.
Wie finde ich eine Datei nach ihrem Inhalt statt nach dem Namen?
find selbst liest den Inhalt nicht. Verwenden Sie grep -rn 'Text' /pfad oder die Kombination find . -name '*.conf' -exec grep -l 'Text' {} +.
Warum ist find auf dem Wurzelverzeichnis so langsam?
Es durchläuft alle Verzeichnisse, auch /proc, /sys und eingebundene Laufwerke. Begrenzen Sie die Suche auf ein konkretes Verzeichnis, ergänzen Sie -xdev und -maxdepth oder schließen Sie Unnötiges mit -prune aus.
Kann ich die Ergebnisse von find nach Datum sortieren?
Ja: find . -type f -printf '%T@ %p\n' | sort -n zeigt die Dateien von alt nach neu, wobei %T@ die Änderungszeit in Sekunden seit der Epoche ist.
Wie finde und lösche ich leere Verzeichnisse?
Der Befehl find . -type d -empty -delete entfernt alle leeren Verzeichnisse, auch solche, die erst nach dem Löschen ihrer Unterordner leer geworden sind. Starten Sie ihn zuerst ohne -delete und prüfen Sie die Liste.
Dieses Thema wird im Kurs „Linux: с нуля до уверенного администрирования“ ausführlich mit Praxis behandelt.
Zum Kurs