[[:tux|{{ :linux.png?40|}}]] ===== find: Syntax und Beispiele ===== find((http://unixhelp.ed.ac.uk/CGI/man-cgi?find)) 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 [[:tux:xargs|hier klicken]] \\ **Verwandte Artikel:** [[:tux:xargs|-> xargs: Syntax und Beispiele]] [[:tux:chmod|-> chmod rekursiv auf Dateien und Verzeichnisse anwenden]] \\ --- //pronto 2010/04/04 17:16// {{keywords>linux find syntax beispiele}}