====== find ======
===== Dateien nach Namen (und/oder Eigenschaften) suchen =====
find Pfad -name GesuchteDeteiName -print 2>/dev/null
z.B. die Datei "text.txt" im aktuellen Verzeichniss (inklusive Unterverzeichnisse) suchen:
find . -name text.txt -print 2>/dev/null
**Alle regulären Dateien** (keine Verzeichnisse oder Gerätedateien) **rekursiv ab dem aktuellen Verzeichnis auflisten:**
find . -type f -exec ls {} ;
Um symbolische Links dabei zu ignorieren (das '!' negiert das darauf folgende **-type l**):
find . ! -type l -exec ls {} ;
:!: Durch den Parameter "**-maxdepth n**" kann man die Tiefe des Suchvorgangs auf **n** Verzeichnisebenen beschränken.
Directories in Filesystem auflisten:
find . -type d -print
Suchen aller Files die jünger sind als ein Vergleichsfile:
find . -newer -print
Suchen aller Files die in den letzten 7 Tagen verändert wurden:
find . ! -mtime +7 -print
Suchen aller Files die in den letzten 7 Tagen NICHT verändert wurden:
find . -mtime +7 -print
Suchen aller Files samt User- und Gruppenzugehörigkeit, aber nur Verzeichnisnamen und Berechtigungen ausgeben (Filename abschneiden):
find . -name "*" -type f -ls 2>/dev/null | awk '{print $5, $6, $11}' | sed 's#[^/]*$##'
===== Dateien nach Inhalte suchen =====
Ist man mit der Ausgabe von Dateinamen zufrieden, so kann man das **ls**-Kommando durch das eigentlich gewünschte ersetzen. Die Zeichenfolge **{}** wird jeweils durch den Namen der Datei ersetzt, bevor das Kommando aufgerufen wird.
z.B. alle Dateien (also ab '/' bzw. '.') nach dem String "%%www.kreick.de%%" durchsuchen:
find / -exec grep "www.kreick.de" {} \; -print 2>/dev/null
find . -exec grep "www.kreick.de" {} \; -print 2>/dev/null
(Die Option **-print** kann man weglassen.)
Suchen aller Files (Filename) welche "pattern" (hier "stdio.h") enthalten:
find . -type f -exec grep -l "stdio.h" {} \;
Suchen aller Files welche "pattern" enthalten mit Ausgabe der Zeile (gesamten Zeileninhalt), die das genannte Muster beinhaltet:
find . -type f -exec grep "stdio.h" {} \;
===== Dateien nach Eigenschaften suchen und darauf Kommandos ausführen =====
Veraltete Dateien löschen (hier älter als **5 Tage**):
find /Absoluter/Pfad -name DateiNameMuster -mtime +5 -exec rm {} \;
Konkrett:
find /trace/prg123 -name "*" -mtime +5 -exec rm {} \;
find /trace/prg123 -name "*" -mtime +5 -exec rm {} +
:!: Der Unterschied zwischen den beiden Kommandos ('**+**' statt '**\;**') besteht darin, daß im ersten Fall **rm** für **jede** Datei separat aufgerufen wird (ressourcefressend), im zweiten wird erst die Liste mit den Dateinamen erstellt und dann auf einmal **die ganze Liste** dem **rm** übergeben (viel schneller). Bei übermäßig langen Verzeichnissen kann jedoch die 2. Variante zu Fehlerhaften Ergebnissen führen.
Alle Files mit der Endung (.o) in Filesystem löschen:
find . -name "*.o" -exec rm -i {} \;
Löschen aller "core" und "*.BAK" Files:
find . (-name core -o -name '*.BAK') -exec rm -f {} \;
Alle Files/Verzeichnisse/Sonstiges ab dem aktuellen Verzeichnis finden, die keinem gültigen User gehören:
find . -nouser -ls 2>/dev/null
Alle Files/Verzeichnisse/Sonstiges ab dem aktuellen Verzeichnis finden, die keine gültige Gruppe besitzen:
find . -nogroup -ls 2>/dev/null
Alle Files/Verzeichnisse ab dem aktuellen Verzeichnis finden, die keinen gültigen User besitzen, und den Owner auf "zieluser" ändern:
find . -nouser -type f -exec chown --changes zieluser {} \; 2>/dev/null
find . -nouser -type d -exec chown --changes zieluser {} \; 2>/dev/null
Alle Files/Verzeichnisse ab dem aktuellen Verzeichnis finden, die keine gültige Gruppe besitzen, und die Gruppenzugehörigkeit auf "zielgruppe" ändern:
find . -nogroup -type f -exec chgrp --changes zielgruppe {} \; 2>/dev/null
find . -nogroup -type d -exec chgrp --changes zielgruppe {} \; 2>/dev/null
Suchkriterien (Quelle: [[https://wiki.ubuntuusers.de/find/]]):
^Kriterium ^Beschreibung ^
|-amin n |Sucht nach Dateien, die innerhalb der letzten n __Minuten__ **gelesen** wurden |
|-mtime +n |Sucht nach Dateien, die älter als n __Tage__ sind (Beispiel: "-mtime +3" alles was älter als 3 Tage ist) |
|-mtime -n |Sucht nach Dateien, die weniger als n __Tage__ alt sind |
|-iname DATEI |Sucht nach Dateien mit dem Namen DATEI ohne Beachtung der Groß und Kleinschreibung |
|-newer DATEI |Sucht nach Dateien, die nach DATEI verändert wurden |
|-nouser |Sucht nach Dateien, deren User-ID keinem Benutzer entspricht |
|-nogroup |Sucht nach Dateien, deren Gruppen-ID keiner Gruppe entspricht |
|-type f |Sucht nur nach regulären Dateien |
|-type d |Sucht nur nach Verzeichnissen |
|-user BENUTZER |Sucht nur nach Dateien des Benutzers BENUTZER |
----
Stand: 08.04.2024
EOF