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 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