find

Achtung!

Diese Seite wird aktuell überarbeitet. Bitte hier keine Änderungen mehr vornehmen, sondern in Baustelle/find!

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. Ein Terminal öffnen

Inhaltsverzeichnis
  1. Installation
  2. Übersichten
  3. Beispiele
  4. Weitere Informationen
  5. Links

Wiki/Icons/terminal.png find ist ein Kommandozeilenprogramm für die Dateisuche. Dabei kann man auf vielfältige Weise die Suche filtern, z.B. nach Dateiname, -alter, -größe und die Suchergebnisse weiterverarbeiten und/oder formatiert ausgeben.

Da unter unixoiden Systemen der Leitsatz "Alles ist eine Datei" gilt, werden auch Verzeichnisse und andere äquivalente Objekte gefunden. Es wird der Verzeichnisbaum ab den ggf. explizit bezeichneten Startverzeichnissen durchsucht. Eine Alternative zu find (mit Vor- und Nachteilen) bietet der Befehl locate.

Installation

Das Programm ist im Paket

von Ubuntu enthalten und ist deshalb auf jedem System vorinstalliert.

Übersichten

Bevor einige praktische Beispiele die vielfältigen Verwendungsmöglichkeiten von find zeigen, zwei kurze Übersichten.

Suchkriterien

Im Folgenden sind einige, wenn auch nicht alle Suchkriterien aufgeführt.

Suchkriterien für find
Kriterium Beschreibung
-name DATEI sucht nach dem Namen DATEI. Werden Platzhalter verwendet, müssen sie maskiert werden, sonst interpretiert sie schon die Shell. Z. B: \*.txt oder "???.t*xt"
-iname DATEI sucht nach dem Namen DATEI - ohne Beachtung der Groß und Kleinschreibung.
-type T sucht mit f (=file) nur nach regulären Dateien und mit d (=directory) nur nach Verzeichnissen.
-mtime n sucht nach Dateien, deren Inhalt zwischen n und n+1 Tage alt (m=modified) ist.
-mtime +n sucht nach Dateien, deren Inhalt älter als n Tage ist. Beispiel: -mtime +3 alles was älter als 3 Tage ist.
-mtime -n sucht nach Dateien, deren Inhalt weniger als n Tage alt ist.
-ctime -n sucht nach Dateien, deren Status (Modus, Besitzer oder Gruppe) oder Name vor n bis n+1 Tagen geändert (c=changed) wurde.
-atime n sucht nach Dateien, auf die zuletzt vor n*24h zugegriffen (a=acessed) wurde. Dabei werden Bruchteile ignoriert, um -atime +1 zu entsprechen muss die Datei also vor höchstens zwei Tagen gelesen worden sein.
-mmin n sucht nach Dateien, deren Inhalt vor n-1 bis n Minuten geändert wurde.
-newer DATEI sucht nach Dateien, die nach DATEI verändert wurden.
-size n[cwbkMG] sucht Dateien die n Zuordnungseinheiten belegen. Folgende Marker können zusätzlich verwendet werden: c für Bytes, w für Zwei-Byte-Wörter, b für 512-Byte-Blöcke (Standard), k für KiB (Kibibyte), M für MiB, G für GiB.
-user BENUTZER sucht nur nach Dateien des Benutzers BENUTZER.
-nouser sucht nach Dateien, deren User-ID keinem Benutzer entspricht.
-nogroup sucht nach Dateien, deren Gruppen-ID keiner Gruppe entspricht.
-maxdepth n sucht nur im aktuellen und Unterverzeichnissen bis zur Tiefe n-1.
-depth sucht erst rekursiv im Inhalt der Verzeichnisse, bevor das Verzeichnis selbst untersucht wird. (Standard bei -delete Aktion)

Aktionen

Aktionen für find
Aktion Beschreibung
-fprint DATEI gibt die gefunden Dateinamen nicht auf die Standardausgabe (Bildschirm) aus, sondern schreibt diese in die Datei DATEI.
-exec KOMMANDO {} \; wendet auf alle Funde den Shellbefehl KOMMANDO an. {} steht dabei als Platzhalter für die gefundenen Dateinamen. Das Zeichen ; terminiert den von find aufzurufenden Shellbefehl, damit es nicht unbeabsichtigt von der Shell interpretiert wird muss es mit \ maskiert werden.
-execdir KOMMANDO {} + wendet auf alle Funde den Shellbefehl KOMMANDO an. Im Ggs. zu -exec wird das Kommando im Verzeichnis, in dem die Datei liegt, ausgeführt. Das + kann (ebenso wie im Kommando -exec) statt ; verwendet werden, wenn {} der letzte Parameter ist; es werden dann mehrere Funde auf einmal an KOMMANDO übergeben.
-ok KOMMANDO {} \; Wie -exec, allerdings wird vor jeder Aktion eine Bestätigung erfragt. {} steht dabei als Platzhalter für die Funde.
-okdir KOMMANDO {} + Wie eine Kombination von -ok und -execdir, d.h. es wird eine Bestätigung erfragt, und das Kommando wird im Fundordner ausgeführt.
-delete löscht die gefundenen Dateien und leeren Verzeichnisse.

Beispiele

Es gibt eine Unzahl weiterer Beispiele, z.B. die Suche nach Eigentümer, Berechtigungen, Dateisystem u.v.m - eine komplette Übersicht bieten die Manpage, die Infoseiten zu find sowie die sehr ausführliche Seite findutils auf gnu.org {en}.

Startverzeichnis(se)

Es wird der Verzeichnisbaum ab den angegebenen Startverzeichnissen durchsucht, was mit zusätzlichen Suchkriterien begrenzt werden kann.

Name

Pfad(teile)

Sucht man mittels Pfadteilen, kommt man mit -name nicht weiter. Das Suchkriterium -path ist hier die Lösung, denn es erlaubt die Verwendung des Namenstrenners /.

Dateitypus (Verzeichnis/Datei)

Alter

Auch hier gibt es, ähnlich wie bei der Größe, Mindestalter (+), Höchstalter (-) und genaues Alter.

Größe

Sonstige Suchkriterien

Kombinationen

Man kann die Suchoptionen aber auch per oder bzw. nicht verknüpfen:

Bei umfangreichen Kombinationen kann eine Klammerung erforderlich sein, um das gewünschte Resultat zu erhalten:

Aktionen

Mit -exec und dessen Varianten lassen sich beliebige Programme auf den Fundstellen ausführen.

Weitere Informationen

Alternativen

find ist fast immer das Mittel der Wahl, wenn es darum geht, auch Unterverzeichnisse zu durchsuchen. Wenn man den Dateinamen genau kennt, kann locate eine bessere Wahl sein. locate arbeitet allerdings mit einem Index, der 1x täglich aktualisiert wird, und findet daher ganz frische Dateien nicht.

Für die spezielle Suche nach Programmen wird man whereis benutzen.

Im aktuellen Verzeichnis, ohne Unterverzeichnisse zu berücksichtigen, kommt man mit automatischer Vervollständigung und den Jokerzeichen * und ? oft weiter, wenn man Namensbestandteile kennt. Manche Programme bieten auch von sich aus an, Unterverzeichnisse zu berücksichtigen, siehe ls und Shell/grep.

Typische Fehler

find ohne Ende

Wenn die Suche mit find läuft und viel zu viele Ergebnisse ausspuckt und nicht aufhören will, so bricht man find mit Strg + C ab.

Der Pfad muss vor dem Suchkriterium stehen

Wenn man den Stern * nicht maskiert kommt es oft zu folgender Meldung:

find /tmp -name *sh 
find: Der Pfad muß vor dem Suchkriterium stehen: adhoc.sh
Aufruf: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [Pfad...] [Suchkriterium]

Mit

find /tmp -name "*sh" 

ist das leicht geheilt.

Seltsame Größen

Bei der Suche nach Dateigrößen kann man leicht verzweifeln, wenn man nicht dahinter kommt, dass die Vorgabemaßeinheit Blöcke à 512 Bytes ist.

find -size 200c 

sucht nach Größen, die man erwartet.

Seltsames Nichtfinden bei Größen wie k, M, G

Sucht man nach Dateien, die kleiner sind als 1000k, so werden Dateien bis maximal 999k gefunden:

find -size -1000k 

Das klingt zunächst plausibel, aber es wird keine Datei gefunden, die 999001 Bytes groß ist, denn es wird erst aufgerundet (auf 1000k) und dann verglichen (nicht kleiner als 1000k). Krasser noch, wenn man Dateien bis 1M suchen wollte - selbst 1 Byte ist größer als die nächstkleinere Ganzzahl in dieser Maßeinheit, also größer als 0M, und wird daher nicht gefunden. Das ist nicht sehr intuitiv, also Obacht.

Kombination von UND und ODER ergibt unerwartetes

Bei der Kombination von mehreren Optionen mit UND und ODER helfen Klammern Fehler zu vermeiden.

Positionssensitiv

Bei mehreren Optionen und Ausdrücken (options und expressions) unterscheiden sich erstere von zweiteren dadurch, dass Optionen nicht mit ODER gruppiert werden können - die Optionen werden immer für die ganze Suche verwendet. Stehen die Optionen hinter Ausdrücken, so sieht das aus, als habe der User eine andere Absicht gehabt, und man bekommt eine Warnung:

Folgende Meldung erhält man, wenn man Optionen nach Argumenten benutzt.

find tmp -name "a" -maxdepth 3 -mindepth 3 
find: Warnung: Sie haben die Option -maxdepth nach dem Argument -name angegeben, aber Optionen sind nicht positionssensitiv (-maxdepth beeinträchtigt sowohl Tests, die vor ihr als auch nach ihr definiert sind). Diese Optionen ist vor den anderen Argumenten anzugeben.

Provozieren kann man die Warnung etwa so:

find ./SUCHVERZEICHNIS -maxdepth 4 -name foo -or -maxdepth 2 

xargs und Schleifen

Oft findet man Konstruktionen mit find ... xargs oder Shellschleifen die find bemühen. Fast immer lässt sich das Problem durch eine der Aktionen (-okdir, -execdir, ...) eleganter lösen.

Die Aktion -delete steht an der falschen Stelle

So löscht z.B. der folgende Aufruf den kompletten Inhalt des Ordners /home/otto/:

find /home/otto/ -delete -name Cache