====== find ======
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.
===== Voraussetzungen =====
* Zugriff auf die Linux-Kommandozeile
* Grundkenntnisse in [[sammlung:bash_kommandos|Bash-Kommandos]]
* Optional: Verständnis von [[sammlung:dateirechte_uebersicht|Dateiberechtigungen]]
===== Grundlegende Syntax =====
find [PFAD...] [OPTIONEN] [AUSDRUCK]
===== Häufige Anwendungsfälle =====
==== Nach Namen suchen ====
# 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"
==== Nach Typ suchen ====
# Nur Dateien
find /pfad -type f
# Nur Verzeichnisse
find /pfad -type d
# Symbolische Links
find /pfad -type l
# Sockets
find /pfad -type s
==== Nach Größe suchen ====
# 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
==== Nach Datum suchen ====
# 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
==== Nach Berechtigungen suchen ====
# 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
===== Erweiterte Suche =====
==== Nach Besitzer suchen ====
# 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
==== Suchtiefe begrenzen ====
# 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
==== Logische Operatoren ====
# 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
===== Aktionen auf gefundene Dateien =====
==== Ausführen von Befehlen ====
# 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
==== Informationen ausgeben ====
# 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"
===== Praktische Beispiele =====
==== Systemwartung ====
# 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
==== Sicherheit ====
# 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
==== Backup und Archivierung ====
# 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/ \;
==== Entwicklung ====
# 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
==== Multimedia ====
# 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
===== Nützliche Optionen =====
^ 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 |
| -print | Ausgabe (Standard) |
| -ls | Detaillierte Ausgabe |
===== Hinweise =====
* find durchsucht rekursiv; nutze ''-maxdepth 1'' für nur ein Verzeichnis
* Verwende ''2>/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''
* Bei Dateinamen mit Leerzeichen nutze ''-print0'' mit ''xargs -0''
* find gibt Exit-Code 0 zurück, wenn alle Dateien erfolgreich verarbeitet wurden
===== Fehlerbehebung =====
* **"Permission denied"**: Nutze ''sudo'' oder filtere Fehler mit ''2>/dev/null''
* **Zu viele Ergebnisse**: Verfeinere Kriterien oder nutze ''-maxdepth''
* **Befehl nicht gefunden**: Prüfe Pfad oder nutze absoluten Pfad in ''-exec''
* **Dateinamen mit Sonderzeichen**: Nutze ''-print0'' und ''xargs -0''
* **Langsame Suche**: Schränke Suchbereich ein oder nutze ''locate'' für schnelle Namenssuche
===== Siehe auch =====
* [[sammlung:grep|grep - Textdurchsuchung]]
* [[sammlung:ls|ls - Verzeichnisse auflisten]]
* [[sammlung:dateirechte_uebersicht|Dateiberechtigungen]]
* [[sammlung:bash_kommandos|Bash Kommandos Übersicht]]
* [[sammlung:tar|tar - Archivierung]]
{{tag>linux kommandozeile dateien suche verwaltung system}}