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