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. find ist unverzichtbar für Systemadministration, Backup-Strategien und Dateimanagement.
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