Kurzfassung: find ist ein mächtiges Kommandozeilenwerkzeug zum Durchsuchen von Verzeichnisstrukturen. Es findet Dateien und Verzeichnisse basierend auf Namen, Größe, Datum, Berechtigungen und vielen weiteren Kriterien. Unverzichtbar für Systemadministration, Backup-Strategien und Dateimanagement.
find durchsucht rekursiv Verzeichnisbäume und wendet Suchkriterien auf jede gefundene Datei an. Es kann auch Aktionen auf gefundene Dateien ausführen und ist das Standardwerkzeug für komplexe Dateisuchen.
find [PFAD...] [OPTIONEN] [AUSDRUCK]
# Exakter Name find /pfad -name "datei.txt" # Mit Wildcards find /pfad -name "*.log" # Groß-/Kleinschreibung ignorieren find /pfad -iname "*.TXT" # Mehrere Muster find /pfad -name "*.txt" -o -name "*.log"
# Nur Dateien find /pfad -type f # Nur Verzeichnisse find /pfad -type d # Symbolische Links find /pfad -type l # Sockets find /pfad -type s
# Größer als 100MB find /pfad -size +100M # Kleiner als 1KB find /pfad -size -1k # Genau 50 Bytes find /pfad -size 50c # Leere Dateien find /pfad -type f -empty
# Geändert in den letzten 7 Tagen find /pfad -mtime -7 # Älter als 30 Tage find /pfad -mtime +30 # Geändert in den letzten 2 Stunden find /pfad -mmin -120 # Zugegriffen heute find /pfad -atime 0
# Dateien mit 777-Rechten find /pfad -perm 777 # Dateien mit mindestens Leserechten für alle find /pfad -perm -444 # SUID-Dateien finden find /pfad -perm /4000 # Beschreibbare Dateien für Gruppe find /pfad -perm -g=w
# Nach Benutzername find /pfad -user username # Nach UID find /pfad -uid 1000 # Nach Gruppe find /pfad -group groupname # Dateien ohne gültigen Besitzer find /pfad -nouser
# Nur aktuelles Verzeichnis find /pfad -maxdepth 1 -name "*.txt" # Mindestens 2 Ebenen tief find /pfad -mindepth 2 -name "*.log" # Symbolische Links nicht folgen find /pfad -P -type l
# UND (implizit) find /pfad -name "*.txt" -size +1M # ODER find /pfad -name "*.txt" -o -name "*.log" # NICHT find /pfad ! -name "*.txt" # Kombiniert find /pfad \( -name "*.txt" -o -name "*.log" \) -size +1M
# Mit -exec (ein Befehl pro Datei) find /pfad -name "*.tmp" -exec rm {} \; # Mit -exec und Bestätigung find /pfad -name "*.bak" -ok rm {} \; # Mehrere Dateien an einen Befehl (effizienter) find /pfad -name "*.txt" -exec grep "Suchbegriff" {} + # Mit xargs (parallel, effizienter) find /pfad -name "*.log" | xargs gzip
# Detaillierte Ausgabe (wie ls -l) find /pfad -name "*.conf" -ls # Nur Dateinamen find /pfad -name "*.txt" -print # Mit Nullzeichen getrennt (sicher für Dateinamen mit Leerzeichen) find /pfad -name "*.txt" -print0 | xargs -0 grep "Muster" # Mit printf formatieren find /pfad -printf "%p %s %u\n"
# Alte Log-Dateien finden und löschen find /var/log -name "*.log" -mtime +90 -delete # Große Dateien finden (über 1GB) find / -type f -size +1G 2>/dev/null | head -20 # Temporäre Dateien aufräumen find /tmp -type f -atime +7 -delete # Verwaiste Dateien ohne Besitzer find / -nouser -o -nogroup 2>/dev/null
# SUID/SGID-Dateien finden find / -perm /6000 -type f 2>/dev/null # Weltweit beschreibbare Dateien find / -perm -002 -type f 2>/dev/null # Dateien mit unsicheren Rechten find /home -type f -perm 777 2>/dev/null # SSH-Schlüssel mit falschen Rechten find ~/.ssh -type f ! -perm 600
# Dateien des letzten Tages archivieren find /data -type f -mtime -1 | tar -czf backup.tar.gz -T - # Duplikate nach Größe finden find /pfad -type f -exec du -h {} + | sort -h | uniq -d -w 10 # Backup nur geänderter Dateien find /source -type f -newer /marker.txt -exec cp {} /backup/ \;
# Alle Python-Dateien finden und Syntax prüfen find . -name "*.py" -exec python3 -m py_compile {} \; # TODO-Kommentare in Code finden find . -name "*.js" -exec grep -Hn "TODO" {} \; # Leere Verzeichnisse entfernen find . -type d -empty -delete # Dateien nach Erweiterung zählen find . -type f | sed 's/.*\.//' | sort | uniq -c
# Bilder größer als 5MB komprimieren find ~/Pictures -name "*.jpg" -size +5M -exec mogrify -quality 85 {} \; # Musik nach Künstler organisieren find ~/Music -name "*.mp3" -exec bash -c 'mkdir -p "$(dirname "$1")/$(id3 -q "%a" "$1")" && mv "$1" "$(dirname "$1")/$(id3 -q "%a" "$1")/"' _ {} \; # Videos älter als 1 Jahr löschen find ~/Videos -name "*.mp4" -mtime +365 -delete
| Option | Bedeutung |
|---|---|
| -name | Suche nach Name (case-sensitive) |
| -iname | Suche nach Name (case-insensitive) |
| -type | Dateityp (f=Datei, d=Verzeichnis, l=Link) |
| -size | Dateigröße (c=Bytes, k=KB, M=MB, G=GB) |
| -mtime | Änderungsdatum in Tagen |
| -atime | Zugriffsdatum in Tagen |
| -ctime | Änderung der Metadaten in Tagen |
| -mmin | Änderungsdatum in Minuten |
| -perm | Dateiberechtigungen |
| -user | Besitzer |
| -group | Gruppe |
| -maxdepth | Maximale Suchtiefe |
| -mindepth | Minimale Suchtiefe |
| -exec | Befehl ausführen |
| -delete | Gefundene Dateien löschen |
| Ausgabe (Standard) | |
| -ls | Detaillierte Ausgabe |
-maxdepth 1 für nur ein Verzeichnis2>/dev/null um Fehler zu unterdrücken (z.B. bei fehlenden Berechtigungen)-exec mit \; führt Befehl für jede Datei aus; mit + wird Befehl einmal mit allen Dateien ausgeführt-delete ist sicherer als -exec rm, aber teste immer zuerst mit -print-print0 mit xargs -0sudo oder filtere Fehler mit 2>/dev/null-maxdepth-exec-print0 und xargs -0locate für schnelle Namenssuche