find: Syntax und Beispiele

find1) gehört zu den am häufigst benötigten Befehlen in einer Shell und der Umgang damit ist den meisten (Shell) Anwendern geläufig. Aber wie viele Unix Kommandos ist auch find mit zahlreichen Optionen ausgestattet, die als Filter für die Suche verwendet werden können. Der Aufruf lautet:

$ find Path -Options -Tests Suchstring -print 
 

Path: Gibt den Pfad an, in welchem gesucht werden soll. Dabei kann zB das Rootverzeichnis "/", das Homedirectory "~", das aktuelle Verzeichnis "." oder ein beliebig spezifizierter Pfad "/foo/bar" verwendet werden. find sucht immer rekursiv!

-Options: Gibt die Befehls-Optionen an. Die gebräuchlichsten Optionen sind:

Option Beschreibung
-maxdepth n find durchsucht standardmäßig die Verzeichnisse rekursiv ab dem angegebenen Suchpfad.
Mit -maxdepth n wird die Suchtiefe auf n-Verzeichnisse eingeschränkt
-mount
-xdev
Verhindert die Suche auf anderen Filesystemen wie zB Netzlaufwerken
-L Follow symbolic links; Ohne Angabe von -L wertet find den Symlink selbst aus. Diese Option folgt dem
Symlink und wertet zB im Falle eines Verzeichnisses den Inhalt des Verzeichnisses aus und nicht
den Symlink als solches.

-Tests: Gibt an nach welchen Kriterien gesucht werden soll. Sucht man zB nach einen Datei- oder Verzeichnisnamen gibt man das mit der Option -name an; sucht man nach den Besitzer von Dateien oder Verzeichnissen wird -user verwendet. Die folgende Liste zeigt die gebräuchlichsten Kriterien auf:

Kriterium (-Test) Beschreibung
-name Sucht nach Datei- oder Verzeichnisnamen
-user Sucht nach dem Eigentümer einer Datei oder Verzeichnis; die Angabe einer UID ist zulässig
-group Sucht nach Dateien oder Verzeichnissen die zu einer bestimmten Gruppe gehören
-perm Octalzahl Sucht nach den Berechtigungen Octalzahl von Dateien oder Verzeichnisse zB -perm 777
-cmin n Sucht nach Dateien welche in den letzten n Minuten geändert wurden
-type [fdl] Sucht nach angebenen Dateitypen: f → Datei; d → Verzeichnis; l → symbolischer Link
-empty Sucht nach leeren Dateien oder Verzeichnissen
-size [+/-]n[ckMG] Sucht nach Dateien grösser "+" bzw. kleiner "-" n c → Byte; k → Kilobyte; M → Megabyte und G → Gigabyte

Logische Verknüpfungen:

Die verschiedenen Optionen von find sind kombinierbar. Beispielsweise könnte man nach Dateien im aktuellen Verzeichnis suchen die mit .log enden und grösser sind als 1MB. Bei einem logischen UND müssen alle Aussagen zutreffen und bei einem logischen ODER muss mindestens eine Aussage zutreffen. Die gebräuchlichsten Operatoren sind:

Operator Beschreibung
! Die Negation eines logischen Ausdrucks. Das Ausrufezeichen (!) repräsentiert den NICHT-Operator.
-a Die UND-Verknüpfung von logischen Ausdrücken. Werden mehrere logische Ausdrücke hintereinandergeschrieben,
wird dies implizit als UND interpretiert. Man kann auch explizit den -a Operator verwenden.
-o Die ODER-Vernüpfung von logischen Ausdrücken wird durch den Operator -o erreicht.

Bedenken Sie bei der Weitergabe der Ausgabe bitte, dass find ohne Angabe weiterer Parameter immer rekursiv durch den gesamten Verzeichnisbaum sucht!

Ausgabe an weitere Kommandos weiterleiten (Actions):

Oft ist es mit der Anzeige der gefundenen Resultate nicht getan, viel mehr wird die Ausgabe häufig weiterverarbeitet. Das kann zB ein Lösch-Befehl, ein Verschieben-Befehl oder ein Umbennen-Befehl sein. Dem find-Befehl stehen dafür zahlreiche Action Kommandos zur Verfügung. Die folgende Tabelle enthält ein paar Beispiele, welche öfter verwendet werden:

Action Beschreibung
-delete Delete Files;
-exec command {}[;+] Execute Command; alle von find gefundenen Ergebnisse werden dem durch -exec ausgeführten
Kommando als Argument übergeben. Das Semikolon bzw Plus-Zeichen schliesst den Befehl ab. Werden
viele Argumente dem Befehl übergeben kann die Verwendung des Plus-Zeichens die Performance des
auszuführenden Befehls deutlich erhöhen. Besitzt ein Kommando mehr Argumente, legt die Zeichenfolge {}
die Position der von find gelieferten Argumente fest.
-ok command {}; Wie -exec, fordert jedoch eine Bestätigung zum Ausführen des Kommandos auf
-print0 Schreibt den vollständigen Namen der Datei oder des Verzeichnisses zur Standardausgabe,
gefolgt von einem NULL-Zeichen an Stelle des sonst üblichen NEWLINE-Zeichen. Dies kann notwendig
sein, wenn in den Suchergebnissen Leerzeichen zu erwarten sind, da darauf folgende Kommandos
ein Leerzeichen häufig als Ende des Arguments verstehen. Dem ausführenden Operator kann
(-exec oder -xargs) kann dann mitgeteilt werden, das Argument bis zum NULL-Zeichen zu lesen

Beispiele: (Syntaxcheck an Mac OSX 10.6.3 → Darwin 10.0)

Sucht rekursiv ab aktuellen Verzeichnis (.) nach Dateien oder Verzeichnissen die exakt IMG_1234.jpg heissen:

$ find . -name IMG_1234.jpg
 

Sucht nur (-maxdepth 1) im aktuellen Verzeichnis nach Dateien oder Verzeichnissen die mit .jpg enden und zeigt diese mit ausführlichen Informationen an (-ls):

$ find . -maxdepth 1 -name \*.jpg -ls
 

Sucht im gesamten Homedirectory (~) des angemeldeten Users nach Dateien und Verzeichnissen die dem User root gehören:

$ find ~ -user root
 

Sucht im gesamten Dateisystem (/) nach Dateien oder Verzeichnissen die der Gruppe ftp angehören:

$ find / -group ftp
 

Sucht im gesamten Dateisystem (/) nach Dateien und Verzeichnissen mit Vollberechtigung (777):

$ find / -perm 777 -print0
 

Sucht im Verzeichnis /var/log nach Dateien die mit .log enden und in den letzten fünf Minuten (-5) verwendet wurden:

$ find -L /var/log -cmin -5 -name \*.log
 

Sucht rekursiv in tmp nach leeren Dateien oder Verzeichnissen:

$ find -L /tmp -empty -print0
 

Sucht rekursiv im eigenen Homedirectory (~) nach Dateien grösser 1GB:

$ find ~ -size +1G -print0
 

Sucht rekursiv in Verzeichnis /var/log nach Dateien die mit .log enden und grösser (+) als 500 KB sind:

$ find -L /var/log -name \*.log -a -size +500k
 

Sucht nur im Verzeichnis /var/log nach Dateien die kleiner (-) sind als 500KB und nicht (!) dem User root gehören:

$ find -L /var/log -maxdepth 1 -size -500k -a ! -user root
 

Sucht im tmp-Verzeichnis nach leeren Dateien und Verzeichnissen und löscht diese:

$ find -L /tmp -empty -exec rm -rf \;
 

Sucht nur in /var/log nach bz2 komprimierte Dateien (alte Logfiles) und löscht diese. Ein sudo-Kommando ist erforderlich, da Root der Eigentümer der Logdateien ist:

$ sudo find -L /var/log -maxdepth 1 -name \*.bz2 -delete
 

Sucht Dateien in meinem Homedirectory (~), die nicht (!) mir Selbst $(whoami) gehören und listet diese ausführlich auf (-ls):

$ find ~ ! -user $( whoami ) -ls
 

Sucht nur (-maxdepth 1) auf meinem Desktop (~/Desktop) nach Dateien (-type f), schliesst die gesuchten Elemente mit einem NULL-Zeichen ab (-print0) um Leerzeichen im Dateinamen zu berücksichtigen und pipet die Ausgabe (|) nach xargs, welches das NULL-Zeichen auswertet (-0) und zeigt den Dateityp (file) der gefundenen Elemente an:

$ find ~/Desktop -maxdepth 1 -type f -print0 | xargs -0 file
 

Note: Bei der Verwendung von zB -exec rm -rf {} ; wird für jedes Argument welches find an die zu ausführende Anwendung übergibt ein eigener Prozess gestartet. Verhindert werden kann dies dadurch, dass man die Ausgabe mit einer Pipe an xargs übergibt. Für Details hier klicken


Verwandte Artikel:
-> xargs: Syntax und Beispiele
-> chmod rekursiv auf Dateien und Verzeichnisse anwenden


pronto 2010/04/04 17:16

tux/find.txt (108028 views) · Zuletzt geändert: 2012/10/25 16:13 von wikisysop
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0