find - Dateien und Verzeichnisse suchen


find sucht bestimmte Dateien und/oder Verzeichnisse und führt auf die gefundenen Einträge die angegebenen Aktionen aus.

Syntax: find <Pfad>... -[<Ausdruck>...]
Syntax: find <Pfad>... -[<Test>...] [-<Aktion>...]

Beschreibung:

find ist das universelle Werkzeug zum Auffinden von Dateien und Verzeichnissen. Durch die Vielzahl der unterstützten Optionen kann die Spezifikation im Argument des entsprechenden Eintrags sehr genau vorgenommen werden, sogar noch exakter als mit dem ls- oder tree-Befehl.

Die Spezifikation kann über bestimmte Tests erfolgen. Diese können mittels Operatoren zusammengefasst werden. Die Tests werden als Boolsche Ausdrücke behandelt. Sie liefern entweder true oder false zurück. Bei true wird die folgende Aktion ausgeführt, ansonsten wird nach einem weiteren Eintrag gesucht.

Argumente, die mit einem der folgenden Zeichen >>  -   !   (   ) ,  << beginnen, bezeichnen eine Option bzw. einen Test: . Die Angaben, die vor diesen Optionen bzw. Tests stehen, werden als Pfadnamen interpretiert; alle diese Argumente folgen als Teil des entsprechenden Ausdrucks. Bei der Angabe mehrerer Tests wird, sofern diese durch Leerzeichen voneinander getrennt sind, die UND-Verknüpfung vorgenommen.

Die Optionen dieses Befehls werden in zwei Gruppen unterteilt:

Optionen mit globaler
Wirkung
beeinflussen die Bearbeitungsweise der Datei- und Verzeichniseinträge.
Optionen mit lokaler Wirkung werden auf den jeweils aktuellen (sich im Test befindlichen Eintrag) angewendet und liefern hierbei einen Rückgabewert, der (evtl. durch Verknüpfung mit anderen) das Ausführen einer Aktion bewirkt oder unterbindet.

Weiterhin stellt find eine Vielzahl von Ausgabeformatierungen unter Verwendung der Funktion printf (der Voreinstellung) zur Verfügung. Somit ist es leicht, Verzeichnislisten beliebigen Formates anzulegen.

Darüberhinaus kann find mit den gefundenen Dateien/Verzeichnissen bestimmte Aktionen ausführen, auf Wunsch auch interaktiv.

Voreingestellungsgemäß folgt find keinen Links. Die Aktionen beginnen im aktuellen Verzeichnis, sofern kein Pfad angegeben wurde.


Optionen mit globaler Wirkung:

-daystart mit den Optionen -atime, -amin, -ctime, -cmin, -mtime und -mmin werden Zeiten vom Beginn des Tages an berechnet und nicht bezogen auf die letzten 24 Stunden.
-depth (Tiefe) Der Inhalt des Verzeichnisses wird vor dem Verzeichniseintrag selbst bearbeitet.
-follow

(verfolgen) Symbolische Links werden verfolgt. Implizit wird dabei die Option -noleaf ausgeführt.

Das voreingestellte Verhalten von find überspringt Links auf Verzeichnisse.

-maxdepth <Tiefe> Unterverzeichnisse werden nur bis zur mit "<Tiefe>" - eine nichtnegative Ganzzahl - angegebenen Ebene bearbeitet und nicht (wie voreingestellt) alle Ebenen. Der Eintrag "0" Bewirkt hier, dass nur die in der Kommandozeile übergebenen Dateien und Verzeichnisse bearbeitet werden.
-mindepth <Tiefe> Unterverzeichnisse werden nur ab der mit "<Tiefe>" - eine nichtnegative Ganzzahl - angegebenen Ebene bearbeitet, bezogen auf das aktuelle Verzeichnis.
-noleaf erzwingt die Bearbeitung aller Einträge (einschließlich >>.<< und >>..<<. Diese Option wird im Zusammenhang mit nicht-*nix-kompatiblen Filesystemen angewendet.
-mount,
-xdev
Es wird nur auf dem Filesystem (Datenträger gesucht, auf dem das erste spezifizierte Verzeichnis liegt.
-version Programmversion

Optionen mit lokaler Wirkung:

Zeitkritische Tests:

-amin <Zeit> Auf den Eintrag wurde vor <Zeit> Minuten zugegriffen.
-anewer <Datei>

Auf den Eintrag wurde vor weniger Zeit als auf <Datei> zugegriffen.

Die ggf. mit angegebene Option -follow muss nach -anewer angegeben werden, damit -anewer Wirkung zeigt.

-atime <Zeit> Vor <Zeit> Tagen wurde auf die Datei zugegriffen.
-ctime <Zeit> Der Dateistatus wurde vor <Zeit> geändert.
-cnewer <Datei>

Der Status des Eintrags wurde vor weniger Zeit geändert als der von <Datei>.

Die ggf. mit angegebene Option -follow muss vor -cnewer angegeben werden, damit -cnewer Wirkung zeigt.

-ctime <Zeit> Die Statusänderung erfolgte vor <Zeit> Stunden.
-mmin <Zeit> Der Eintrag wurde vor <Zeit> Minuten das letzte mal verändert.
-mtime <Zeit> Der Eintrag wurde vor <Zeit> Tagen das letzte mal geändert.
-never <Datei> Der Eintrag ist vor weniger Zeit als <Datei> verändert worden.

Die ggf. mit angegebene Option -follow muss vor -never angegeben werden, damit -newer Wirkung zeigt.

    Typspezifische Tests:
-fstype <Typ>

Der Eintrag befindet sich auf einem Datenträger mit dem Filesystem <Typ>.

Folgende Werte können ua. angegeben werden: minix, msdos, ext (2), proc, hpfs.

Durch die Option -printf %F kann der <Typ> dargestellt werden.

-type <Typ> Der Eintrag ist vom Typ <Typ>. Folgende Angaben sind möglich:

<Typ>

Bedeutung

b

blockorientiertes Gerät

c

zeichenorientiertes Gerät

d

Verzeichnis

f

File

l

symbolischer Link

p

Pipeline-Datei

s

Socket

 

Tests für Zugriffsrechte:

-gid <Zahl> Der Eintrag gehört zur Gruppe mit der GID <Zahl>.
-group <Name> Der Eintrag gehört zur Gruppe mit dem Namen <Name>. Es kann auch eine GID angegeben werden.
-nouser Der Eigentümer ist dem System nicht bekannt (er ist nicht in der /etc/passwd eingetragen).
-nogroup Die Gruppe ist dem System nicht bekannt (sie ist nicht in der /etc/passwd eingetragen).
-uid <Nummer> Der Eintrag gehört dem Anwender mit der UID <Nummer>.
-used <Zeit> Auf den Eintrag ist vor <Zeit> Tagen nach der letzten Änderung zugegriffen worden.
-user <Name> Der Eintrag gehört <Name>. Es kann auch eine UID angegeben werden.
-xtype <Typ> Vgl -type. Einträge, die keine Links bezeichnen und vom Typ <Typ> sind. <Typ> wird unter -type aufgeführt.
-perm <Modus> Die Zugriffsrechte entsprechen <Modus>.

Andere Tests:

-inum <Zahl> Der Eintrag hat die I-Node <Zahl>.
-link <Zahl> Der Eintrag hat <Zahl> harte Links.
-lname <Muster> Der Eintrage bezeichnet einen Link auf einen Eintrag, der <Muster> entspricht.
-name <Muster> Der Eintrage entspricht dem <Muster>. Metazeichen müssen maskiert werden.
-iname <Name> (ignore case name) Variante zu -name, die nicht zwischen Gross- und Kleinschreibung unterscheidet.
-path <Muster> Der Pfad entspricht dem <Muster>. Metazeichen müssen maskiert werden.
-ipath <Name> (ignore case path) Variante zu -path, die nicht zwischen Gross- und Kleinschreibung unterscheidet.
-regex <regulärer Ausdruck> Der Eintrag entspricht <regulärem Ausdruck>.
-size <Anzahl> [b|c|k|w] Der Eintrag belegt <Anzahl> Blöcke (Voreinstellung). b spezifiziert als Einheit Bytes, w 2-Byte-Worte (words). c legt je Block 512 Bytes zugrunde, k 1025 Bytes.
-empty liefert wahr, wenn die (reguläre) Datei oder das Verzeichnis leer sind.
-true liefert immer true.
-false liefert immer false.

Ausgabeoptionen:

-print Der relative Pfadname wird an die Standardausgabe weitergegeben. Voreinstellung ist Action.
-print0 Der relative Pfadname wird an die Standardausgabe weitergegeben, gefolgt von einem Nullbyte. Dadurch ist es möglich, auch Pfadnamen zu verarbeiten, die ein LF-(Zeilenende)Zeichen enthalten.
-printf <Format> gibt die formatierte Ausgabe für die Einträge an die Standardausgabe weiter.
-fprint <Datei>

Schreibt den Pfadnamen in die Datei <Datei>. Diese wird erzeugt, faslls sie noch nicht vorhanden ist, ansonsten wird die Ausgabe angehängt.

Standardausgabe und Standardfehlerausgabe können durch /dev/stdout bzw. /dev/stderr direkt angesprochen werden.

-fprint0 <Datei> wie -fprint mit einem abschließenden Nullbyte.
-fprintf <Datei> kombiniert -fprint und -printf, so dass die formatierte Ausgabe in eine Datei geschrieben wird.
-fls0 <Datei> die Kombination von -ls und fprint.
-exec <Befehle>\; <Befehle> werden für die Einträge ausgeführt, bei denen der Test true lieferte.
-ok <Befehle>\; vor dem Ausführen von <Befehle> wird eine Bestätigung verlangt.

Anmerkungen:

Die ausgeführten Aktionen werden durch Ausdrücke gesteuert. Diese setzen sich aus Optionen zusammen, die entweder Tests sind oder Verknüpfungen darstellen.


Siehe auch:   chmod   ls   touch
nach oben

Beispiele für die Nutzung des Programms:

Alle Dateien im Verzeichnis finden, die in den letzten 3 Tagen verändert wurden:

user@sonne> find /etc -mtime -3 -print

 

Dateiattribute (Name, die Zeit des letzen Zugriffes, die Zeit der letzten Statusänderung, die Zeit der letzen Änderung) ausgeben:

user@sonne> find -printf "%p %a %c %t\n"

 

Dateien mit gesetztem SUID-BIT suchen:

user@sonne> find / -perm +4000

 

Verzeichnisse durchsuchen nach Namen, die mit "cat" beginnen:

user@sonne> find /bin /tmp /var -name 'cat*'

 

Verzeichnisse durchsuchen nach Einträgen, deren (Pfad)namen nicht "cat" enthalten:

user@sonne> find /bin /tmp /var ! -path 'cat*' -o ! -name 'cat*'

 

Einträge finden, auf die in den letzten 12 Tagen nicht mehr zugegriffen wurde:

user@sonne> find /usr/local -atime +12

 

Einträge zeilenweise ausgeben, die in den letzten 24 Stunden verändert wurden:

user@sonne> find -mtime -1 -printf "%f %t\n"

 

Verzeichnis /tmp recursiv nach Einträgen durchsuchen, die älter als 28 Tage sind und diese nach Bestätigung löschen:

user@sonne> find /tmp -atime +28 -ok rm \{\} \;

 

Skript erstellen mit Einträgen, auf die innerhalb der letzten 15 und 25 Tage zugegriffen wurde:

user@sonne> find -type f -atime +15 -atime +25 -printf \ "lha a last15days %p \n"

Omega-X