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

  2. ⚓︎ Was ist und wie benutzt man eine Posix-Shell?

Inhaltsverzeichnis
  1. Alternativen
  2. Installation
  3. Aufruf
  4. Suchstrategie
  5. Optionen
  6. Startpunkte
  7. Suchkriterien
    1. Name
    2. Pfad
    3. Typ
    4. Größe
    5. Alter
    6. Sonstige Suchkriterien
  8. Numerische Angaben
  9. Kombinationen
  10. Aktionen
    1. Dateien listen
    2. Dateien löschen
    3. Dateien bearbeiten
  11. Beispiele
  12. Problembehebung
    1. find läuft endlos
    2. Fehlermeldungen
    3. Warnungen
  13. Links

Wiki/Icons/terminal.png Das Kommandozeilenprogramm find findet Dateien mit bestimmten vorgebbaren Kriterien in ganzen Verzeichnisbäumen ab angegebenen Startpunkten. Dabei kann es die Suche auf vielfältige Weise filtern, z.B. nach Dateiname, -alter, -größe und die Suchergebnisse formatiert ausgeben und/oder weiter verarbeiten.

Da unter unixartigen Systemen der Leitsatz „Alles ist eine Datei“ gilt, werden auch Verzeichnisse und andere in der Dateihierarchie eingetragene Dateitypen (z.B. Sockets) gefunden. Der Einfachheit halber meint in diesem Artikel das Wort „Datei“ meistens jedes von find gefundene Ergebnis unabhängig von dessen konkretem Dateityp.

Alternativen

Das Programm find ist wegen seiner zahlreichen Suchkriterien sehr mächtig und daher fast immer das Mittel der Wahl, wenn es darum geht, auch Unterverzeichnisse zu durchsuchen bzw. eine Menge von über die Suchkriterien bestimmten Dateien zu bearbeiten. Wegen seiner Mächtigkeit kann es aber auch schwer anwendbar sein. In manchen Situationen kommt man daher mit anderen Methoden schneller oder einfacher zum Ziel:

Installation

Das Programm ist in den offiziellen Paketquellen von Ubuntu enthalten und wird auf jedem System installiert.

Befehl zum Installieren der Pakete:

sudo apt-get install findutils 

Dieser Artikel beschreibt die vorstehende Version. Es gibt allerdings auch eine neue Implementierung namens rust-findutils, die experimentierfreudige Anwender optional aus universe installieren können und verspricht, das traditionelle find 1:1 zu ersetzen.

Aufruf

Im Terminal[1] verwendet man das Programm mit dieser generellen Syntax:

find OPTIONen STARTPUNKTe TESTs AKTIONen 

Ein Aufruf kann ziemlich komplex werden; hier ein konkretes Beispiel:

find -P ~ -xdev -type f -printf '%s\t%k\t%p\n' | sort -g -r | head -n 5 

In diesem Beispiel ist „-P“ eine OPTION, „~“ der STARTPUNKT, „-xdev -type f“ sind die TESTs und „-printf '%s\t%k\t%p\n'“ die AKTION. Es ist nicht unüblich, die Ausgabe von find per Pipe weiterzuleiten an andere Programme, wie auch in diesem Beispiel gezeigt. Das Beispiel ermittelt die 5 größten regulären Dateien im Homeverzeichnis des Benutzers, dabei werden symbolische Links und eingebundene Dateisysteme nicht berücksichtigt; weitere Erklärungen siehe späteren Abschnitt Beispiele.

⚓︎ Weitere Details kann man dem Manual (Manpage) des Programms entnehmen:

Noch weiter informativ sind

Suchstrategie

Das Programm durchläuft die Dateinamensbäume ab den Startpunkten als Wurzeln rekursiv und, sofern man das nicht selbst begrenzt, vollständig nach einer von zwei möglichen Strategien:

  1. „Breite vor Tiefe“: Gefundene Ordner werden nach der Behandlung von regulären Dateien und anderen Dateitypen als letztes durchsucht.

  2. „Tiefe vor Breite“: Gefundene Ordner werden sofort durchsucht, also vor regulären Dateien und anderen Dateitypen behandelt.

Bei jeden Aufruf von find wird die Suchstrategie einmalig vor dem Beginn der Suche durch Analyse der Kommandozeile bestimmt und dann nicht mehr verändert.

Die Auswahl der Strategie ändert nicht, was gefunden wird, sondern nur die Reihenfolge, in der es gefunden und ggf. gelistet wird. Vorgabe ist „Breite vor Tiefe“, sofern man weder bei Tests -depth noch die Aktion -delete angibt. Jedes dieser beiden Schlüsselworte aktiviert „Tiefe vor Breite“.

Optionen

Tabelle 1: Optionen
Kriterium Beschreibung
-H
-L
-P
Diese Optionen schließen sich gegenseitig aus, d.h. wenn man mehrere angibt, wird nur die letzte Angabe wirksam. Wenn man keine angibt, gilt als Vorgabe -P.
Diese Optionen bestimmen den Umgang des Programms mit Dateien vom Typ symbolischer Link, die mit -P stets ignoriert werden und mit -L stets berücksichtigt und verfolgt werden sowie mit -H manchmal beachtet werden.
-D DEBUG-OPTS DEBUG-OPTS ist eine mit Kommata getrennte Liste von einem oder mehreren möglichen Begriffen, die man sich mit
find -D help 
anzeigen lassen kann. Mit dieser Option erhält man zusätzlich zum normalen Arbeitsergebnis für die angegebenen Bereiche Diagnoseinformationen auf dem Standardfehlerkanal.
-O0 oder-O1 Diese beiden Optionen sind gleichwertig und -O1 ist die Vorgabe. Die Reihenfolge von Tests wird automatisch so optimiert, dass Filterungen nach Dateinamen zuerst erfolgen.
-O2 Zusätzlich zur ersten Stufe werden auch Filterungen nach dem Dateityp (Tests -type und -xtype) so früh wie möglich, aber nach den Tests für Dateinamen ausgeführt.
-O3 Es werden zusätzlich zur zweiten Stufe weitere Optimierungen aktiviert.

Soll auch in verlinkten Ordnern (sowohl absolut, als auch rekursiv) im angegebenen Suchpfad gesucht werden, so ist beim Programmaufruf ein -L anzufügen. Dieses muss jedoch vor den Suchpfad:

Startpunkte

Startpunkte geben an, wo gesucht wird, nicht was gesucht wird. Ist keiner angegeben, wird im aktuellen Arbeitsverzeichnis gesucht. Startpunkte müssen nach Optionen und vor den ebenfalls optionalen Suchkriterien und Aktionen platziert werden. In den meisten Fällen wird es sich dabei um Verzeichnisse handeln, andere Dateitypen sind aber auch erlaubt. Wenn nicht die ganzen gegebenenfalls dort darunter liegenden Verzeichniszweige durchsucht werden sollen, kann die Durchsuchungstiefe mit zusätzlichen Suchkriterien begrenzt werden.

⚓︎

Suchkriterien

Tabelle 2: Ausgewählte Tests bzw. Suchkriterien
Kriterium Beschreibung
-name MUSTER sucht Dateinamen, die dem Muster MUSTER entsprechen. MUSTER ist ein Shell-Glob, kann also Jokerzeichen wie „*“ und „?“ enthalten, die dann immer quotiert oder maskiert werden müssen, damit die aufrufende Shell sie nicht interpretiert. Beispiele: „\*.txt“ oder „'???.t*xt'“. MUSTER kann den Schrägstrich „/“ nicht enthalten und -name untersucht nur den Eigennamen, nicht den Pfad zur Datei.
-iname MUSTER arbeitet wie -name, aber ohne Beachtung der Groß- und Kleinschreibung.
-path MUSTER arbeitet ähnlich wie -name, untersucht aber auch den Pfad zur Datei und MUSTER darf daher auch den Schrägstrich enthalten.
-ipath MUSTER arbeitet ähnlich wie path, aber ohne Beachtung der Groß- und Kleinschreibung.
-regex REGEX
-iregex REGEX
arbeiten ähnlich wie -path bzw. -ipath, aber das Suchmuster ist nicht als Shell-Glob, sondern als regulärer Ausdruck anzugeben. Es werden standardmäßig reguläre Ausdrücke mit der Syntax von Emacs erwartet, das kann man mit -regextype ändern.
-type T selektiert Dateien nach ihrem Typ. T ist ein Kennbuchstabe zur Angabe des Typs, dabei steht f (= file) für reguläre Dateien, d (= directory) für Verzeichnisse und l für symbolische Links; weitere siehe Dokumentation. Man kann für T auch eine mit Kommata getrennte Liste von Kennbuchstaben angeben, wenn man nach mehreren Typen gleichzeitig suchen will.
-size N selektiert Dateien nach ihrer Größe: N ist eine ganze Zahl mit optionalem Vorzeichen (-, keines, +) und angehängtem Multiplikator (c für Byte, k für KiB (Kibibyte), M für MiB, G für GiB), z.B. -42k, 42k, +42k, 2M) Syntaktisch ist der Multiplikator optional, jedoch wird in der Praxis immer einer verwendet, denn die Voreinstellung b für 512 Byte ist leider nicht praxisgerecht. Der wirksame Zahlenbereich ändert sich mit Vorzeichen und Multiplikator, d.h. 4096c4k usw! Näheres siehe Größe und find rechnet seltsam.
-empty sucht leere Dateien inkl. Ordner, also solche ohne Inhalt.
-Xtime N
-Xmin N
selektieren Datei nach dem Zeitpunkt ihrer letzten Änderung oder Verwendung. X ∈ { a, c, m } bestimmt den abzufragenden Zeitstempel, N ist eine ganze Zahl mit optionalem Vorzeichen (-, keines, +), aber ohne angehängten Multiplikator, weil sich dieser aus dem Namen des Tests ergibt. Details siehe Alter und find rechnet seltsam.
-newer DATEI sucht nach Dateien, deren Inhalt nach dem von DATEI verändert wurde.
-cnewer DATEI sucht nach Dateien, deren Verwaltungsdaten nach denen von DATEI verändert wurde.
-newerXY DATEI sucht nach Dateien, deren Zeitstempel X nach dem Zeitstempel Y von DATEI verändert wurde. X, Y ∈ { a, c, m }
-newerXt ZEITSPEZ sucht nach Dateien, deren Zeitstempel X nach der Zeitangabe ZEITSPEZ verändert wurde. Details siehe Text.
-user BESITZER
-group GRUPPE
sucht nur nach Dateien, die dem Benutzer BESITZER bzw. der Gruppe GRUPPE gehören. BESITZER bzw. GRUPPE kann ein Name oder eine numerische Kennung UID bzw. GID sein.
-uid N
-gid N
arbeitet ähnlich wir vorstehende Tests, jedoch muss man als N eine numerische Kennung UID bzw. GID mit optionalem Vorzeichen angeben. Damit kann man dann auch z.B. nach „alle Benutzer mit kleinerer UID als N“ suchen.
-nouser sucht nach Dateien, deren numerische Besitzer-Kennung keinem dem System bekannten Benutzer entspricht.
-nogroup sucht nach Dateien, deren numerische Gruppen-Kennung keiner dem System bekannten Gruppe entspricht.

Es gibt einige Optionen, die wie Tests verwendet werden, aber dann nicht die einzelnen Dateien beurteilen, sondern die Suche generell modifizieren. Es ist besser, diese Optionen lt. folgender Tabelle 3a zum Beginn der Tests anzugeben, denn sonst meckert find eine Warnung, macht aber trotzdem das, was es für richtig hält und das ist möglicherweise nicht das, was der Bediener haben wollte. Außerdem gibt es als Tests geschriebene positionelle Optionen nach Tabelle 3b, welche die Arbeitsweise ihnen folgender Tests modifizieren.

⚓︎

Tabelle 3a: Globale Optionen
Kriterium Beschreibung
-help zeigt eine Kurzanleitung des Programms. Es wird nicht gesucht.
-maxdepth n sucht ab dem Startpunkt nur n (ganze Zahl ≥ 0) Verzeichnisse tief. Bezeichnet dieser ein Verzeichnis – z.B. implizit das aktuelle Verzeichnis – zählen dessen Einträge schon zu Tiefe 1.
-mindepth n durchsucht zwar alles, ignoriert aber alle Dateien mit kleinerer Verzeichnistiefe als angegeben.
-depth sucht erst rekursiv im Inhalt der Verzeichnisse, bevor das Verzeichnis selbst untersucht wird. (Standard bei -delete Aktion) ▶ Suchstrategie
-xdev
-mount
Order von anderen eingebundenen Dateisystemen werden nicht durchsucht.
Das bei GNU find veraltete Synonym -mount soll man vermeiden.

⚓︎

Tabelle 3b: Positionelle Optionen
Kriterium Beschreibung
-daystart misst für alle (!) darauf folgenden -Xtime- und -Xmin-Kriterien ab 00:00 h des aktuellen Tages, also ab Mitternacht. Einmal eingeschaltet, lässt sich dieser Modus nicht mehr ausschalten.
-regextype TYPE ändert für folgende Texts mit regex den Typ des regulären Ausdrucks. Zulässige Typen listet
find -regextype ? 

Hinweis:

Die in diesem und folgenden Kapiteln ab diesem Hinweis gezeigten Beispiele enthalten fast alle einen Punkt „.“ nach dem Programmnamen. Das soll den Leser daran erinnern, dass an dieser Stelle von ihm ein selbst gewählter Startpunkt oder eine Folge von Startpunkten einzusetzen ist, ab dem/denen gesucht werden soll. Man kann allerdings die Befehle auch genau so wie gezeigt verwenden und sie arbeiten dann im aktuellen Arbeitsverzeichnis (working directory). Schließlich kann man den Punkt auch weglassen, weil find eine leere Folge von Startpunkten automatisch und stillschweigend durch den Punkt ersetzt.

Name

Pfad

Will man die Suche auf bestimmte Pfade einschränken, kommt man mit -name nicht weiter. Das Suchkriterium -path ist hier die Lösung, denn es erlaubt die Verwendung des die Namen trennenden Schrägstrichs /.

Typ

Größe

Man kann nach Dateien suchen, die kleiner, exakt gleich oder größer als ein vorgebbarer Vergleichswert sind, dabei wird der Vergleichsoperator durch das Vorzeichen des Vergleichswertes bestimmt:

Vorgenannte Befehle funktionieren mit jeder Anzahl von Bytes. Bei großen Schwellen kann man auch die Multiplikatoren k für Kibibytes (1024), M für Mebibytes (10242) oder G für Gibibytes (10243) angeben, wegen der ungewöhnlichen Rechenweise sollte man das nur in folgender Art und Weise tun:

Man schreibe also numerische Angaben niemals ohne Multiplikator und immer

Alter

Die Tests -Xtime, Xmin, -newer, -Xnewer sowie -newerXt und -newerXY (mit X, Y ∈ { a, c, m }) vergleichen einen Zeitstempel der untersuchten Datei mit dem aktuellen Zeitpunkt, Mitternacht oder einem Zeitstempel einer Referenzdatei. An der Stelle X ist der Kennbuchstabe des zu untersuchenden Zeitstempels einzusetzen:

Der Linux Kernel unterstützt vier Zeitstempel, das Programm find kann aber mit dem von POSIX nicht definiertem Zeitstempel btime (für birth, Geburt, auch creation time) nicht umgehen. Lediglich für die Tests -newerXY ist eine Unterstützung angedacht, aber in GNU find für Linux bisher nicht implementiert.

Bei -Xtime und -Xmin gibt, ähnlich wie bei der Größe, das Vorzeichen des Vergleichswertes an, ob man auf älter (+), gleichaltrig oder jünger (-) prüfen will. Die Tests -Xtime verwenden als Maßeinheit immer Tag im Sinne einer Zeitspanne vor 24 Stunden, nicht im Sinne von Kalendertag, und die Tests -Xmin verwenden Minute. Wie bei den Test auf Größe gilt auch hier: find rechnet seltsam mit den Vergleichswerten.

Diese Befehle und auch ihre Pendants mit atime und ctime können den Bediener verwirren. In der Praxis justiert man mit -daystart den zeitlichen Bezugspunkt auf den Beginn (Mitternacht) des aktuellen Tages, arbeitet damit effektiv doch mit Kalendertagen und kann dann (und sollte nur!) solche Befehle verwenden:

Die Tests-Xmin arbeiten mit zeitlicher Auflösung von Minuten:

Achtung!

Eine vor dem Test notierte Angabe -daystart wirkt auch unwiderruflich auf späteres -Xmin!

⚓︎ Die Tests -newer und Varianten bieten eine mehr dem natürlichen Sprachgebrauch entsprechende Syntax und Semantik:

⚓︎ Die Tests -newerct und newermt sind von praktischem Wert, da sie als Vergleichswert auch umgangssprachliche Formulierungen ermöglichen, beispielsweise:

Für den Vergleichswert ist alles zulässig, was auch date für seine Option „-d“ akzeptieren würde, in dieser Sprache ist 0000 eine Schreibweise für Mitternacht.

Sonstige Suchkriterien

Einige ausgewählte Beispiele:

⚓︎

Numerische Angaben

Experten-Info:

(Dieses Kapitel kann man beim ersten Lesen überschlagen. Es enthält Hintergrundinformationen und Begründungen für praktische Regeln.)

Numerische Angaben für find gehorchen nicht der naiven Erwartung! Für find bedeuten beispielsweise die Angaben 4096c und 4k nicht dieselbe Größe, und die Angabe 4096 (ohne Multiplikator) selektiert per Vorgabe den Multiplikator b alias 512 Byte, und find versteht deshalb 4096 als 2 Mebibyte bzw. 2095104 Byte.

Der von find verwendete Algorithmus berechnet zunächst aus der zu prüfenden Zahl (z.B. die Größe einer Datei) Z und dem Wert des geltenden Multiplikators M die Hilfswerte „Z \ M“ (ganze Zahl) und „Z mod M“.

Anschließend wird ein Testwert V ermittelt: Wenn „Z mod M = 0“, also wenn „Z / M“ ganzzahlig wäre, dann wird „V = Z \ M“ gesetzt, und anderenfalls wird aufgerundet zu „V = 1 + Z \ M“.

Der so ermittelte ganzzahlige Testwert V wird dann mit dem Absolutwert der ganzen Zahl aus dem Vergleichswert N verglichen.

Bei der Suche nach Dateien kleiner als 4096 Byte ergeben sich beispielsweise die Rechenergebnisse lt. folgender Tabelle.

Tabelle 3c?: Rechenbeispiele
TestNMZZ \ MZ mod M = 0VVergleichnaive Erwartung
-size -4096c4096c ≙ 1 40954095ja 40954095 < 4096erfüllt
-size -4096c4096c ≙ 1 40964096ja 40964096 < 4096
-size -4096c4096c ≙ 1 40974097ja 40974097 < 4096
-size -4096 4096b ≙ 5123584 7ja 77 < 4096 zufällig erfüllt
-size -4096 4096b ≙ 5124095 7nein 88 < 4096
-size -4096 4096b ≙ 5124096 8ja 88 < 4096 nicht erfüllt
-size -4096 4096b ≙ 5124097 8nein 98 < 4096
-size -4k 4096k ≙ 10243072 3 ja 33 < 4 erfüllt
-size -4k 4096k ≙ 10244095 3nein 44 < 4 nicht erfüllt
-size -4k 4096k ≙ 10244096 4 ja 44 < 4 erfüllt
-size -4k 4096k ≙ 10244097 4nein 55 < 4

Auch bei Größentests auf „exakte“ Gleichheit (Vergleichswert ohne Vorzeichen) gibt es wegen der Blockarithmetik von find der naiven Erwartung ähnlich widersprechende Ergebnisse (hier nicht gezeigt). Lediglich bei Größentests auf „größer als“ entsprechen die Rechenkünste von find der naiven Erwartung.

Daraus ergeben sich für die Praxis folgende Ratschläge:

Vorstehende Ausführungen und Regeln für die Praxis gelten neben den Tests auf Größe auch für alle weiteren, die eine numerische Angabe erwarten, insbesondere bei den Tests auf Alter. Auch hier bevorzuge man Tests auf „später als“, angegeben durch das Vorzeichen „+“ oder Namensbestandteil newer.

Kombinationen

Die Gesamtheit aller Tests und Aktionen bildet den in der Dokumentation so genannten Ausdruck (expression), in dem standardmäßig der Operator „Und“ die einzelnen Komponenten miteinander verbindet. Möglich sind aber auch andere Operatoren gemäß folgender Tabelle.

Tabelle 4: Operatoren
Operator Beschreibung
(Leerraum) Durch Leerraum verbundene Tests bzw. Aktionen werden mit -a verbunden.
-a
-and
Konjunktion („Und“): Beide Tests müssen bestanden werden, oder der Dateiname gehört nicht mehr zum Arbeitsergebnis.
-o
-or
Disjunktion („Oder“): Die Datei muss mindestens einen, darf aber auch beide Tests bestehen, oder ihr Dateiname wird aus dem Arbeitsergebnis entfernt.
-not
!
Negation: Der Dateiname wird aus dem Arbeitsergebnis entfernt, wenn die Datei den Test besteht.
, Listenbearbeitung: In Konstrukten wie z.B. „A , B , C“ werden die Komponenten sequenziell und einzeln bearbeitet, und die Arbeitsergebnisse außer dem letzten (also im Beispiel das von C) werden verworfen.

(In der Tabelle sind die Schreibweisen nach POSIX fett dargestellt, die anderen sind in der GNU-Variante von find Synonyme dazu.)

Die übliche Rangfolge der Operatoren wird beachtet: Negation bindet stärker als Und; Und bindet stärker als Oder. Wenn man etwas anderes will, muss man selber Klammern () verwenden, diese sind als Sonderzeichen der Shell bei ihrer Verwendung im Ausdruck für find immer zu quotieren oder zu maskieren.

Man kann die Suchoptionen aber auch per Oder verknüpfen oder die Negation eines Tests bilden:

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

Auch die Aktionen werden über Operatoren mit Tests verbunden, was manch überraschendes Ergebnis erzeugt. In einem Ordner mit diesen Dateien:

find . 
.
./susanne.png
./susi.txt
./tusnelda.txt
./tusnelda.png
./susi.png
./susanne.txt

ergibt

find . -name 'susi*' -o -name 'susan*' -print 

dieses Ergebnis:

./susanne.png
./susanne.txt

susi wurde also nicht gefunden, obwohl genau das beabsichtigt war. Erst wenn man sich erinnert, dass der Leerraum für „Und“ steht, sowie dass „Und“ stärker bindet als „Oder“, erkennt man die Übereinstimmung der Eingabe mit deren ausführlicheren Schreibweisen:

find . -name 'susi*' -o -name 'susan*' -print
find . -name 'susi*' -o -name 'susan*' -a -print
find . -name 'susi*' -o \( -name 'susan*' -a -print \) 

bedeuten alle dasselbe: Dem Muster susan* entsprechende Dateinamen werden gesucht und ausgegeben; nach dem Muster susi* wird ebenfalls gesucht, aber die Funde werden nicht ausgegeben, weil ein automatisches -print nicht erfolgt wenn man selber eine Aktion wie -print angibt.

Aktionen

Auf ein vorläufiges oder auf das endgültige Suchergebnis kann man eine oder mehrere Aktionen nach folgender Tabelle anwenden; insbesondere kann man auch -exec mehrfach verwenden – meistens ist aber in solchen Situationen ein Skript zweckmäßiger. Auf das endgültige Suchergebnis wird automatisch -print angewendet, sofern man nicht eine eine Aktion aus folgender Tabelle angibt.

Tabelle 5: Aktionen
Aktion Beschreibung
-print erzwingt die zeilenweise Ausgabe von Eigenname mit Pfad jeder gefunden Datei.
-print0 gibt die Dateinamen wie -print aus, trennt diese aber durch ASCII NUL statt durch Zeilenvorschub (ASCII LF).
-printf FORMAT arbeitet wie print, wobei man das Ausgabeformat über FORMAT selber bestimmen kann. Die Möglichkeiten entsprechen weitgehend dem üblichen printf und sind in der Dokumentation beschrieben. In der Regel wird FORMAT immer mit einem Zeilenende „\n“ beendet.
-fprint DATEINAME
-fprint0 DATEINAME
-fprintf DATEINAME FORMAT
-fls DATEINAME
arbeitet wie die entsprechende Aktion ohne führendes f, gibt die gefunden Dateinamen aber nicht auf die Standardausgabe (Bildschirm) aus, sondern schreibt diese in die als DATEINAME benannte Datei, die ggf. gelöscht oder neu angelegt wird.
-ls zeigt die Dateinamen der selektierten Dateien wie der Befehl ls -dils.
-prune verwirft das bisherige Arbeitsergebnis.
-quit beendet das Programm. Das kann sinnvoll sein, nachdem gefunden wurde, was gesucht wurde.
-delete löscht die gefundenen regulären Dateien und leere Verzeichnisse.
-exec KOMMANDO ; wendet auf jeden gefundenen Dateinamen einzeln KOMMANDO (= ein Programm mit optionalen Argumenten) an. Nach einem Argument -exec im Aufruf müssen noch mindestens 2 weitere Argumente folgen. Aus dem ersten und allen weiteren Argumenten, die nicht das Semikolon „;“ sind, wird ein Programmaufruf mit Name und Argumenten erstellt, dabei wird das spezielle Argument „{}“ von find durch den gefundenen Dateinamen (Eigenname mit Pfad) ersetzt. Das erste Semikolon beendet die Konstruktion des Programmaufrufs. Damit es nicht unbeabsichtigt von der aufrufenden Shell interpretiert wird, muss es immer quotiert oder maskiert werden.
-exec KOMMANDO {} + Wendet auf die Gesamtheit aller Funde einmalig KOMMANDO an. Es werden nach -exec noch mindestens 3 weitere Argumente benötigt, davon muss das letzte den Wert „+“ haben und der vorletzte den Wert „{}“ und diese müssen immer quotiert oder maskiert notiert werden, damit sie nicht von der aufrufenden Shell interpretiert werden.
-ok … Statt -exec kann man auch -ok mit derselben Syntax und Semantik für beide Aufrufformen verwenden, lediglich mit folgendem kleinen Unterschied: Mit -ok muss der Bediener vor der tatsächlichen Ausführung von KOMMAND den Aufruf bestätigen.
-execdir …
-okdir …
arbeiten weitgehend wie ihre Pendants ohne angehängtes dir, lediglich mit diesem Unterschied: Die Aktionen ohne angehängtem dir starten KOMMANDO in dem Arbeitsverzeichnis, in dem auch das aufgerufene Programm find aufgerufen wurde. execdir und okdir starten KOMMANDO in dem Ordner, welcher auch die gefundenen Dateien enthält.

Dateien listen

Dateien löschen

Eine etwas kritische Angelegenheit ist das Löschen mit der Aktion -delete.

Achtung!

Da find auch Unterverzeichnisse durchsucht, sollte mit dieser Aktion vorsichtig umgegangen werden. Mit find gelöschte Dateien landen nicht im Papierkorb und können nicht wieder hergestellt werden. Man sollte -delete immer nur als letztes Wort des Aufrufs verwenden.

Der Verwendung sollte ein Test ohne -delete voraus gehen, um sicher zu gehen, nicht zu viele Dateien zu löschen. Für diesen Test ersetzt man in dem beabsichtigten Aufruf -delete durch -print und fügt die globale Option -depth hinzu:

Aus dem beabsichtigten Befehl

find OPTIONen STARTPUNKTe TESTs AKTIONen -delete 

macht man also zunächst für den Test:

find OPTIONen STARTPUNKTe -depth TESTs AKTIONen -print 

Gegenbeispiel:
Der folgende Aufruf löscht den kompletten Inhalt des Ordners /home/ottifant/:

find /home/ottifant/ -delete -name Cache    # falsch! 

Dateien bearbeiten

Mit -exec und dessen Varianten kann man ein beliebiges Programm oder auch ein ausführbares Skript auf jeden Fund anwenden:

Mit -exec & Co. kann man im Prinzip alles starten, was auch der Kernel starten könnte. Wenn man aber ein spezielles Sprachmittel einer Shell wie z.B. Befehlsverkettungen, Umleitungen, eingebaute Funktionen einsetzen möchte, wird das fehlschlagen. Man kann natürlich eine Shell wie die Bash per exec starten und dieser eine mehrfach quotierte Zeichenkette zur Ausführung übergeben – mehrfach quotiert, weil dieser Einzeiler vor der Interpretation durch die aufrufende Shell und durch find und durch die von find gestartete Shell geschützt werden muss, was Schwindel, Schädelweh, mentale Depressionen und dergl. fast sicher erzeugen wird.

Besser sind diese Methoden:

  1. Man erstellt ein Skript für die gewünschte Bearbeitung umd verwendet einen Aufruf wie:

    find … -exec SKRIPT "{}" \; 
  2. oder wie:

    find … -print | SKRIPT 

    Statt eines Skripts kann es natürlich auch ein anderes ausführbares Programm sein; manchmal ist dafür auch xargs hilfreich.

  3. oder man baut find in das Skript ein:

    # im Skript:
    find … -print |
    while read …
    do …
    done

Beispiele

Es gibt eine Unzahl weiterer Beispiele, z.B. die Suche nach Eigentümer, Berechtigungen, Dateisystem u.v.m. Siehe hierzu die Dokumentation.

Das oben unter Aufruf genannte Beispiel

find -P ~ -xdev -type f -printf '%s\t%k\t%p\n' | sort -g -r | head -n 5 

funktioniert so:

Weiteres Beispiel: Der Befehl

sudo find /  -xdev \( -path /home -prune , ! -uid -1000 \) -printf '%U\t%g\t%p\n' 

ermittelt alle Dateien außerhalb der persönlichen Benutzerverzeichnisse, die normalen Benutzern (mit UID ab 1000) gehören, davon sollte es nur sehr wenige mit plausiblen Erklärungen geben.

Funktionsweise:

Beispielausgabe (gekürzt und teilweise zensiert):

1000 ░░░░░ /var/lib/samba/usershares/videos
1000 whoopsie /var/crash/_usr_bin_wireplumber.1000.crash
1000 ░░░░░ /var/log/installer/ubuntu_bootstrap.log.3376
1000 ░░░░░ /var/log/installer/ubuntu_bootstrap.log
1000 ░░░░░ /tmp/.X11-unix/X0

Über alle anderen Fälle sollte der verantwortungsbewusste Systemverwalter nachdenken und, wenn keine plausible Erklärung gefunden werden kann, auch entschlossen seiner Verantwortung entsprechend handeln – denn in solchen Fällen stimmt etwas nicht mit dem System.

Problembehebung

find läuft endlos

Wenn man find eine umfangreiche Aufgabe gibt, z.B. großer Suchbaum, komplizierte Tests, ungeschickte Formulierung von Aktionen mit zu vielen Subprozessen, dann kann das Programm sehr lange laufen, möglicherweise auch mehrere Stunden.

Der Eindruck, es würde niemals mehr zum Ende finden, ist jedoch nicht berechtigt. Selbst wenn man im Suchbaum mit symbolischen Links Schleifen erstellt hat, wird find diese erkennen und nur einmal durchlaufen.

Wer die Geduld verliert, kann die Suche mit der Taste Strg + C abbrechen.

Fehlermeldungen

Gelegentlich verweigert find mit einer Fehlermeldung die Ausführung. Die in der Praxis am häufigsten erscheinende Fehlermeldung erhält man durch fehlerhafte Verwendung von Mustern. Beispiel:

find $HOME -name .* 
find: Pfade müssen dem Ausdruck `.bash_history' vorangestellt werden
find: mögliches nicht zitiertes Muster nach Aussage '-name'?

Statt .bash_history kann auch ein beliebiger anderer Dateiname genannt werden, das ist halt der zufällig erste, den die aufrufende Shell bei der Auswertung des Globs gefunden hat. Das ist auch schon der Bedienfehler: Es wurde nicht verhindert, dass die aufrufende Shell den Glob auswertet. Korrekt ist:

find $HOME -name ".*" 

(Die Formulierung „nicht zitiertes Muster“ ist eine schlechte Übersetzung von "unquoted pattern"; besser wäre hier „ungeschütztes Muster“.)

Warnungen

Achtung!

Warnungen sind tückischer als Fehlermeldungen, weil man die zuerst ausgegebenen Warnungen wegen der dann folgenden (vermutlich fehlerhaften) Ausgabe leicht übersehen kann und dann mit dem falschen Ergebnis weiterarbeitet.

In der Dokumentation wird beim Aufruf alles nach den Startpunkten als AUSDRUCK benannt. Dieser kann globale Optionen (nicht zu verwechseln mit den generellen Optionen), positionelle Optionen, Tests, Operatoren und Aktionen beinhalten. Stehen globale Optionen, die immer für die ganze Suche gelten, nicht am Anfang des Ausdrucks, so sieht das aus, als habe der Nutzer eine andere Absicht gehabt, und man bekommt deshalb eine Warnung.

Beispiel: Der Befehl

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

ergibt eine Warnung

find: Warnung: Sie haben die globale Option -maxdepth nach dem Argument -name angegeben, aber 
globale Optionen sind nicht positionell, d.h. -maxdepth wirkt sich sowohl auf die davor als auch 
auf die danach angegebenen Tests aus. 
Bitte geben Sie globale Optionen vor anderen Argumenten an.

aus und anschließend eine Liste von Dateinamen, die aber vermutlich nicht der (mit find nicht realisierbaren) Vorstellung des Bedieners entspricht.

Im Beispiel war wohl die Absicht des Bedieners: „Suche bis zu 4 Stufen tief nach foo und gebe das aus, oder, wenn es nicht gefunden wird, suche nut 2 Stufen tief und gebe das aus.“ Ein solche Anweisung kann find nicht erfüllen, denn wenn foo nicht gefunden wird, hat es ja schon 4 Stufen durchsucht anstatt der dann verlangten 2.

Daraus ergibt sich die Regel für die Praxis: