Linux find: Dateien suchen mit Beispielen

Linux 12 Min. Lesezeit

find ist der wichtigste Suchbefehl unter Linux: Er durchsucht ein Verzeichnis und alle darin enthaltenen Unterverzeichnisse (rekursiv) und listet die Dateien auf, die den angegebenen Kriterien entsprechen – nach Name, Größe, Änderungsdatum, Eigentümer oder Berechtigungen. Mit den gefundenen Dateien können Sie sofort Aktionen durchführen: Sie können sie löschen, die Berechtigungen ändern oder darin suchen.

Die Beispiele wurden im November 2026 unter AlmaLinux 10.2 mit dem Befehl find aus GNU findutils 4.10 in einem Beispielverzeichnis (/var/www/pelda.hu, eine WordPress-ähnliche Website mit Backups, Logs und Cache) ausgeführt; Ubuntu 26.04 verwendet dieselbe Version. Die Befehle funktionieren sowohl auf einem KVM-VPS als auch in der Terminal-Oberfläche des cPanel-Hostings, dort im eigenen Home-Verzeichnis.

Die Grundform

find WO BEDINGUNGEN AKTION
find /var/www -name 'wp-config.php'
find . -type f -name '*.log'
  • WO: Der Ordner, in dem die Suche beginnt (das . steht für das aktuelle Verzeichnis). Wenn Sie ihn weglassen, sucht der Befehl find im aktuellen Verzeichnis.
  • BEDINGUNGEN: zum Beispiel -name, -type, -size. Bei mehreren Bedingungen gilt standardmäßig die UND-Verknüpfung.
  • AKTION: Wenn Sie keine Aktion angeben, gibt der Befehl find die gefundenen Pfade aus (-print).

Suche nach Name

find . -name 'index.php'       # genauer Name
find . -name '*.php'           # alle .php-Dateien
find . -iname 'readme.txt'     # ohne Beachtung der Groß-/Kleinschreibung

-iname hat bei dem Test sowohl die Datei README.TXT als auch readme.txt gefunden, während -name nur exakte Übereinstimmungen ermittelt hat.

Setzen Sie Platzhalterzeichen (*, ?) stets in Anführungszeichen. Ohne Anführungszeichen ersetzt die Shell diese bereits vor dem Start von find durch die Dateinamen im aktuellen Verzeichnis. Befindet sich dort eine .php-Datei, sucht find nur nach diesem Namen; sind mehrere vorhanden, bricht der Vorgang mit einer Fehlermeldung ab:

$ find . -name *.php
find: paths must precede expression: `index.php'
find: possible unquoted pattern after predicate `-name'?

Der Befehl -name überprüft nur den Dateinamen, nicht den Pfad zu den Ordnern. Für Pfadteile verwendet man den Befehl -path: find . -path '*/uploads/*.php' listet die in den Upload-Ordnern abgelegten PHP-Dateien auf, was ein häufiges Anzeichen für eine gehackte WordPress-Seite ist.

Sie können nach mehreren Namen suchen, indem Sie den Operator -o (ODER) in Klammern verwenden:

find . \( -name '*.jpg' -o -name '*.JPG' -o -name '*.png' \)

Nach Typ: -type

find . -type f -name '*.html'   # nur Dateien
find . -type d -name cache      # nur Ordner
find . -type l                  # szimbolikus linkek
find . -xtype l                 # törött szimbolikus linkek

Mit Links und dem Umgang mit defekten Links befasst sich der Artikel über das Löschen und Umbenennen von Dateien und über Links.

Leere Dateien und Ordner:

find . -empty
find . -type d -empty

Nach Größe: -size

find . -type f -size +100M     # größer als 100 MB
find . -type f -size -10k      # kleiner als 10 kB
find . -type f -size +1G       # größer als 1 GB

Maßeinheiten: c (Byte), k (KiB), M (MiB), G (GiB). + bedeutet größer, - kleiner; ohne Vorzeichen bedeutet es eine exakte Übereinstimmung.

Eine Falle bei kleinen Werten: Der Befehl find rundet die Größe auf die angegebene Einheit auf. Der Befehl -size -1k liefert daher nur Dateien mit einer Größe von 0 Byte: Im Test wurde eine 30-Byte-PHP-Datei als „1k“ groß berechnet und somit nicht berücksichtigt. Geben Sie für einen exakten Grenzwert die Größe in Byte an: -size -1024c. Eine ähnliche Rundung beim Gigabyte-Grenzwert wird im Artikel über die Suche nach error_log-Dateien erläutert.

Die größten Dateien suchen

Eine Liste der großen Dateien mit Angabe der Dateigrößen in lesbarer Form:

find . -type f -size +100M -exec ls -lh {} +

Die fünf größten Dateien, sortiert nach Größe:

find . -type f -printf '%s %p\n' | sort -nr | head -5 | numfmt --to=iec

Der Befehl -printf gibt die Größe (%s, in Byte) und den Pfad (%p) aus, der Befehl sort -nr sortiert die Ergebnisse in absteigender Reihenfolge, und der Befehl numfmt --to=iec wandelt den Wert in eine lesbare Maßeinheit um (350M).

Der Befehl find listet Dateien auf, die größer als 100 MB sind, die fünf größten Dateien sowie Dateien, die vor mehr als 30 Tagen geändert wurden.

Wenn Sie sich nicht für die Größe der Dateien, sondern für die Größe der Ordner interessieren, ist du das bessere Werkzeug: Siehe die Beispiele für den Befehl du.

Nach Zeit: -mtime, -mmin, -newer

find . -type f -mtime +30      # vor mehr als 30 Tagen geändert
find . -type f -mtime -7       # in den letzten 7 Tagen geändert
find . -type f -mmin -60       # in den letzten 60 Minuten geändert

Der Parameter -mtime rechnet in 24-Stunden-Einheiten und rundet nach unten ab: -mtime 1 bezeichnet Dateien, die vor 24 bis 48 Stunden geändert wurden, während -mtime +30 diejenigen bezeichnet, die vor mindestens 31 Tagen geändert wurden. Mit dem Schalter -daystart werden die Tage ab Mitternacht gezählt (find . -daystart -mtime 0 gibt die heute geänderten Dateien an).

Neuer als eine Datei oder ein Datum:

find . -newer referencia.txt
find . -type f -newermt '2026-11-01'
find . -type f ! -newermt '2026-11-01'    # älter als dieses Datum

Neben -mtime gibt es auch -atime (letzter Lesezugriff) und -ctime (letzte Statusänderung, z. B. Berechtigungsänderung). -atime ist unzuverlässig: Auf beiden Testsystemen war das Root-Dateisystem mit der Einstellung relatime eingebunden, wodurch die Lesezeit nur selten aktualisiert wird.

Bei einer gehackten Website ist eine Liste der PHP-Dateien, die in den letzten Tagen geändert wurden, hilfreich:

find /var/www -type f -name '*.php' -mtime -3

Nach Eigentümer und Berechtigung

find . -user root              # Dateien im Besitz von root
find . ! -user www-data        # nicht im Besitz von www-data
find . -group users
find . -nouser                 # Dateien eines gelöschten Benutzers

Nach Berechtigung:

find . -perm 777               # pontosan 777
find . -type f -perm -o+w      # für alle beschreibbare Dateien
find . -type d -perm -0002     # für alle beschreibbare Ordner

Der Befehl -perm 644 ohne Vorzeichen gibt genau die Dateien mit den Rechten 644 zurück, während -perm -644 diejenigen zurückgibt, die mindestens diese Rechte besitzen.

Am häufigsten werden die Berechtigungen angepasst, beispielsweise werden auf einer Website für Ordner die Berechtigungen 755 und für Dateien die Berechtigungen 644 vergeben:

find public_html -type d -exec chmod 755 {} +
find public_html -type f -exec chmod 644 {} +

Die Bedeutung der Zugriffsrechte wird im Artikel über die Befehle chmod und chown erläutert.

Tiefe: -maxdepth, -mindepth

find . -maxdepth 1             # nur der aktuelle Ordner, ohne Unterordner
find . -maxdepth 2 -name '*.log'
find . -mindepth 2 -maxdepth 2 -type d

Die Optionen -maxdepth und -mindepth gelten für die gesamte Suche, unabhängig davon, an welcher Stelle in der Befehlszeile sie stehen; aus Gründen der Lesbarkeit ist es üblich, sie an den Anfang der Bedingungen zu setzen.

Ausschluss von Ordnern: -prune und -not -path

Es gibt zwei Möglichkeiten, einen Ordner (z. B. den Cache oder die Sicherungen) auszuschließen:

# -prune: find betritt den Ordner gar nicht
find . -path ./public_html/wp-content/cache -prune -o -type f -name '*.html' -print

# -not -path: steigt ab, filtert aber die Treffer aus
find . -type f -name '*.html' -not -path '*/cache/*'

Die Option -prune ist schneller, da das ausgeschlossene Verzeichnis überhaupt nicht durchsucht wird; bei einem großen Cache oder einem node_modules-Verzeichnis macht dies einen großen Unterschied. Die Option -print ist am Ende obligatorisch: Ohne sie gibt find auch den Namen des ausgeschlossenen Verzeichnisses aus (im Test erschien auch die Zeile ./public_html/wp-content/cache).

Nach dem Parameter -prune sollte der Wert von -path genauso beginnen wie der Suchpfad (im Fall von . wäre dies ./). Sie können mehrere Ordner in Klammern ausschließen:

find . \( -path ./backup -o -path ./public_html/wp-content/cache \) -prune -o -type f -size +10M -print

Nach Namen, an beliebiger Stelle im Verzeichnisbaum: find . -name cache -prune -o -name '*.html' -print.

Vorgänge mit den gefundenen Dateien

-exec: Befehl ausführen

find . -name '*.php' -exec grep -l 'base64_decode' {} +
find . -name '*.log' -exec ls -lh {} \;

Anstelle von {} werden die gefundenen Dateien eingefügt. Der Unterschied zwischen den beiden Abschlusszeichen:

  • {} +: Die Dateien werden gruppenweise an einen (oder wenige) Befehlsaufrufe übergeben: grep ... fajl1 fajl2 fajl3. Bei vielen Dateien ist dies wesentlich schneller.
  • {} \;: Der Befehl wird für jede Datei separat ausgeführt. Dies ist erforderlich, wenn der Befehl jeweils nur eine Datei akzeptiert oder das {} nicht am Ende der Zeile steht (beispielsweise -exec cp {} {}.bak \;, wodurch für jede Datei eine Kopie mit der Endung .bak erstellt wird).

-ok funktioniert genauso wie -exec ... \;, fragt jedoch vor jeder Datei nach (< rm ... ./logs/access.log > ?).

Suche im Inhalt von Dateien: find und grep

Der Befehl find filtert Dateien heraus, während grep deren Inhalt durchsucht. Auf diese Weise haben wir im Test die verdächtige PHP-Datei gefunden, die wir im Beispielverzeichnis abgelegt hatten:

find . -name '*.php' -exec grep -l 'base64_decode' {} +

Die Option -l gibt nur die Dateinamen aus. Wenn die übrigen Suchkriterien von find nicht benötigt werden, kann grep selbst rekursiv und nach Dateiendungen gefiltert suchen: grep -rl --include='*.php' base64_decode .. find ist dann die bessere Wahl, wenn zusätzlich nach Größe, Datum oder Eigentümer gefiltert werden muss, beispielsweise um nur in PHP-Dateien zu suchen, die in den letzten drei Tagen geändert wurden. Über weitere Möglichkeiten von grep (beispielsweise über die Zeilen vor und nach dem Treffer) wird in einem separaten Artikel berichtet, während die Suche nach Malware im Artikel über ClamAV und Maldet behandelt wird.

xargs und die Option -print0

Die Ausgabe von find kann auch mit dem Befehl xargs weitergeleitet werden, doch bei Dateinamen, die Leerzeichen enthalten, funktioniert dies nur mit der Kombination aus den Optionen -print0 und -0 einwandfrei:

find . -name '*.log' -print0 | xargs -0 ls -l

Ohne -print0 teilt xargs den Namen an den Leerzeichen in zwei Teile:

$ find . -name '*.log' | xargs ls -l
ls: cannot access './public_html/szep': No such file or directory
ls: cannot access 'fajl.log': No such file or directory

In den meisten Fällen ist die Syntax -exec ... {} + einfacher und genauso schnell.

Löschen: -delete

# 1. Zuerst nur auflisten, was gelöscht würde
find . -type f -name '*.html' -mtime +30 -print

# 2. Wenn die Liste stimmt, löschen
find . -type f -name '*.html' -mtime +30 -delete

Die Reihenfolge der Bedingungen ist entscheidend. Der Befehl find wertet von links nach rechts aus, und -delete ist ebenfalls eine Bedingung, die für alle Elemente gilt. Im Test hat der Befehl find ~/cc -delete -name 'c3.html' nicht die Datei c3.html gelöscht, sondern den gesamten Ordner ~/cc, da -delete vor der Überprüfung des Namens auf alle Elemente angewendet wurde. -delete sollte immer an das Ende der Zeile gesetzt werden.

Die Optionen -delete und -prune können nicht zusammen verwendet werden: -delete aktiviert den Modus -depth, in dem -prune wirkungslos ist, und der Befehl find wurde im Test mit einer Warnung abgebrochen, ohne etwas zu löschen. Verwenden Sie in diesem Fall die Option -not -path.

Leere Ordner löschen (beispielsweise nach der Bereinigung eines Caches): find . -type d -empty -delete. Das Löschen ist endgültig; unter Linux gibt es keinen Papierkorb.

Regelmäßige Bereinigung mit Cron

Das Löschen alter Backups oder Cache-Dateien lässt sich gut planen. Dieser Befehl löscht jede Nacht um 3:30 Uhr alle Backups, die älter als 14 Tage sind:

30 3 * * * find /var/backups/pelda -type f -name '*.tar.gz' -mtime +14 -delete

Die Verwendung von cron wird im Artikel über die crontab-Syntax beschrieben.

Suche im gesamten System

sudo find / -xdev -type f -size +100M 2>/dev/null
  • -xdev: Es werden keine anderen Dateisysteme berücksichtigt, sodass /proc, /sys und die gemounteten Festplatten ausgeschlossen bleiben. Ohne die Option -xdev zeigte der Befehl find / im Test die virtuelle Datei /proc/kcore ebenfalls als größer als 100 MB an und meldete Fehler bezüglich der Einträge unter /proc, die während der Ausführung verschwanden.
  • 2>/dev/null: Unterdrückt Fehlermeldungen. Als normaler Benutzer gibt der Befehl find / zahlreiche Permission denied-Zeilen aus (find: '/boot/grub2': Permission denied), zwischen denen es schwierig ist, das gesuchte Ergebnis zu erkennen.

Symbolische Links werden von find standardmäßig nicht verfolgt; mit dem Schalter -L wird auch in den verknüpften Verzeichnissen gesucht (im Test wurden die großen Dateien im unter public_html verknüpften Sicherungsverzeichnis nur bei Verwendung von -L angezeigt).

Schnellsuche nach Namen: „locate“ und „plocate“

Der Befehl locate durchsucht nicht die Festplatte, sondern sucht in einer vorab erstellten Datenbank, weshalb er sehr schnell ist. Auf den Cloud-Images von AlmaLinux 10 und Ubuntu 26.04 war er nicht vorinstalliert; bei aktuellen Distributionen wird er durch das Paket plocate bereitgestellt:

sudo dnf install plocate      # AlmaLinux, Rocky Linux
sudo apt install plocate      # Ubuntu, Debian

sudo updatedb                 # Datenbank aktualisieren
locate wp-config.php
locate -i readme.txt

Die Datenbank wird täglich von einem Timer aktualisiert (unter AlmaLinux durch plocate-updatedb.timer), weshalb locate Dateien, die seit der letzten Aktualisierung erstellt wurden, nicht findet: Im Test lieferte es für eine gerade erstellte Datei kein Ergebnis. Es ist nicht möglich, nach Größe, Datum oder Berechtigungen zu filtern; hierfür ist der Befehl find erforderlich.

Zusammenfassung

Aufgabe Befehl
Nach Name find . -name '*.php'
Unabhängig von Groß- und Kleinschreibung find . -iname 'readme*'
Nur Ordner find . -type d -name cache
Dateien, die größer als 100 MB sind find . -type f -size +100M
Die fünf größten Dateien find . -type f -printf '%s %p\n' | sort -nr | head -5
Dateien, die älter als 30 Tage sind find . -type f -mtime +30
In der letzten Stunde geänderte Dateien find . -mmin -60
Für alle beschreibbare Dateien find . -type f -perm -o+w
Ordner ausschließen find . -path ./cache -prune -o -name '*.html' -print
Text in Dateien suchen find . -name '*.php' -exec grep -l 'Text' {} +
Löschen (am Ende!) find . -name '*.tmp' -mtime +7 -delete
Gesamtes System, ohne Fehlermeldungen sudo find / -xdev -name 'x' 2>/dev/null
Zurück: Linux-Artikel (76)