find ist das Kommando, um Dateien nach bestimmten Kriterien zu suchen (und zu finden).

= Zeitangaben =
Die Zeitangaben (bei -a/c/mtime und -a/c/mmin) um Dateien an Hand ihrer [[ZeitStempelVonDateien|Zeitstempel]] zu finden, sind leider nicht sehr gut dokumentiert.

 * Die Zeitberechnung bezieht sich immer auf die aktuelle Uhrzeit (des gestrigen Tages, in den Formeln hier ist das berücksichtigt)
  * `-mtime +n`: älter als `jetzt - 24h*(n+1)`
  * `-mtime  n`: Alter zwischen `jetzt - 24h*(n+1)` und `jetzt - 24h*n`
  * `-mtime -n`: neuer als `jetzt - 24h*n`

 * Mit `-daystart` wird 00:00 Uhr (des heutigen Tages) anstelle der aktuellen Uhrzeit benutzt.
  * `-daystart -mtime +n`: älter als `00:00 - 24h*n`
  * `-daystart -mtime  n`: Alter zwischen `00:00 - 24h*n` und `jetzt - 24h*(n-1)`
  * `-daystart -mtime -n`: neuer als `00:00 - 24h*(n-1)`

 * /!\ `-daystart` muss vor der Zeitangabe stehen!

 * Suche im Minutenraster
  * `-mmin +n`: älter als `jetzt - n min`
  * `-mmin  n`: Alter genau n min
  * `-mmin -n`: neuer als `jetzt - n min

= Boolsche Operatoren =
Standardmäßig müssen alle Bedingungen erfüllt sein, damit eine so beschriebene Datei gefunden wird (AND). Alternativen (OR) können mit -o gebildet werden:
 * `find -iname cache -o -iname cache4`
findet alle Dateien, die cache oder cache4 heißen.

Klammern kann man auch setzen:
 * `find -type d \( -iname cache -o -iname cache4 \)`
findet alle Verzeichnisse (-type d), die cache oder cache4 heißen.

Eine Bedingung kann auch invertiert werden:
 * `find ! -type d`
findet jede Datei, die kein Verzeichnis ist.

= Tipps + Tricks =
Bei find kommt es oft vor, das die Argumentliste zu lang wird. Dann muss man entweder mit einer for-Schleife arbeiten, oder mit [[xargs]]. Dann werden die Suchergebnisse einzeln übergeben.

= Beispiele =
 * suchen einer Datei nach ihrem Namen: `find /home/luser -name 'Datei*Name*Mit*Wildcards*'`
 * dito, aber ohne Groß/Kleinschreibung zu beachten: `find /home/luser -iname 'Datei*Name*Mit*Wildcards*'`
 * alle Dateien rekursiv auflisten: `find .`
 * alle Unterverzeichnisse auflisten: `find -type d`
 * Suche im gesamten Dateisystem nach Dateien, die auf ".tar" enden `find / -name "*.tar"`
 * Suche alle Dateien, die im Namen "eintest" haben `find / -name "*eintest*"`
 * Finde & lösche firefox lock Dateien `find ~/.mozilla -name .parentlock -o -name lock -exec rm -f {} \;`
 * Ganz bestimmte Pfad/Namenskombinationen: `find /var/www/virtual/ -path "*/logs/*-access.log"`
Zusatz:

Suche alle Dateien unter ~/gambas, deren Name mit  ".class" endet und die im Inhalt "eintest" enthalten

 . {{{find ~/gambas -name "*.class" -exec grep -H "eintest" {} \; }}}

Dateinamen in Kleinbuchstaben umwandeln

 . {{{ find -type f | (while read f; do n=$(echo $f | tr "[:upper:]" "[:lower:]"); mv "$f" "$n"; done) }}}

Für alle Dateien, die in einem Unterverzeichnis "german" vorkommen die Zugriffe ändern

 . {{{for i in $(find -type d -name 'german'); do chmod a+r  $i/*; done}}}

Siehe auch DateienSuchen und SuchenundFinden, auch für weitere Beispiele