- Find
-
find (zu deutsch finde) ist der Name eines UNIX-Programm zum Auffinden von Dateien und Verzeichnissen. Das Programm durchsucht bei jeder Suchanfrage direkt das Dateisystem. find gestattet eine Verfeinerung der Suche nach zahlreichen Kriterien wie etwa Zugriffs- oder Änderungszeit, Dateigröße, Ort, und je nach Variante noch zahlreiche andere. Es ist Teil des POSIX-Standards (IEEE Std 1003.1), und als solches im Standardumfang jeder Unix-Variante zu finden.
Unter Microsoft Windows gibt es ebenfalls den Befehl find, jedoch dient er dort zum Durchsuchen von Dateien, eine Funktion die unter Unix üblicherweise von grep realisiert wird.
Inhaltsverzeichnis
Benutzung
find wird mit folgender Syntax aufgerufen:
find Startverzeichnis [Optionen] Test Aktion Beispiel: find / -name "[Xx]*"
Das Startverzeichnis kann ein absoluter oder relativer Pfad sein, muss aber auf jeden Fall angegeben werden. Möchte man das aktuelle Verzeichnis durchsuchen, so gibt man einfach einen Punkt (.) ein. Für die Tests gibt es verschiedene Möglichkeiten. -name durchsucht den Pfad nach Dateien, deren Name mit dem Muster übereinstimmt und ist wohl der am häufigsten gebrauchte Test. Für eine Auflistung aller Tests kann man im Manual nachschlagen.
Wird, wie im Beispiel, die Aktion weggelassen, führt find automatisch -print aus. Für alternative Möglichkeiten kann man wieder im Manual nachschlagen. Die Funktion -exec wird unten noch näher erklärt.
Gibt man zwei aufeinanderfolgende Tests an, so findet find alle Dateien, auf die beide Tests zutreffen.
find / -name "*.txt" -size +12k
findet also alle Dateien des gesamten Verzeichnisbaums, die auf .txt enden und mindestens 12 Kilobyte groß sind.
Numerische Werte
Ist das Suchkriterium bei find ein numerischer Wert, so gibt es einige Besonderheiten. Gibt man eine Zahl ohne Vorzeichen an, erhält man die Dateien, auf die die Zahl genau passt.
find . -size 24k
findet z.B. alle Dateien, die genau 24 Kilobyte groß sind. Ein Minus ist mit dem mathematischen Operator <= gleichzusetzen. Bei folgendem Befehl werden also alle Dateien gefunden, die höchstens 24 Kilobyte groß sind:
find . -size -24k
Umgekehrt findet ein + alle Dateien, die >= dem Wert sind.
find . -size +24k
findet also alle Dateien, die mindestens 24 Kilobyte groß sind.
exec
find kann Dateien nicht nur finden, sondern auch an andere Programme weiterleiten. Dafür gibt es die Aktion -exec. Will man z.B. alle Dateien, die Benutzern gehören, die nicht mehr existieren, löschen, so reicht der Befehl:
find / -nouser -exec rm {} \;
Nach der Aktion -exec folgt also der normale Programmaufruf für rm. Statt einer Datei existiert der Platzhalter „{}“ (zwei geschweifte Klammern). Dieser steht für alle Dateien, die find findet. Abgeschlossen werden muss der Befehl mit \; (Backslash, Semikolon). Dabei existiert das Risiko, dass man Befehle ausführt, die man eigentlich gar nicht ausführen will. So könnte in unserem Beispiel eine Systemdatei nur fälschlicherweise mit einer nicht existierenden UID erstellt worden sein. Um das zu vermeiden, gibt es die Aktion -ok. Sie funktioniert genau wie -exec, fragt aber bei jeder Befehlszeile nach, ob sie ausgeführt werden soll.
Hier ein Beispiel, wie man mit verschachtelten exec-Befehlen, automatische Archive erzeugen kann.
find . -mtime +$1 -type d -maxdepth 1 -exec echo erstelle {}.tar.bz2... \; -exec tar cjf {}.tar.bz2 {} \; -exec echo fertig \; -exec test -f {}.tar.bz2 \; -exec rm -r {} \;
Erläuterung: Der find-Befehl sucht mit der Option mtime und type nach Verzeichnissen, die älter sind als n Tage (n ist der erste Parameter von der Kommandozeile). Die Option maxdepth sorgt dafür, dass keine Unterverzeichnise ausgegeben werden. Anschließend wird mittels tar-Befehl ein bz2-Archiv erzeugt, geprüft ob es angelegt wurde und bei Erfolg wird das Ursprungsverzeichnis gelöscht (dazwischen werden Statusnachrichten ausgegeben).
Weitere Suchprogramme
Unter Unix gibt es ein paar weitere Suchprogramme.
grep
grep durchsucht einzelne Zeilen auf passende Ausdrücke.
locate
locate funktioniert ähnlich wie find, durchsucht aber nicht das Dateisystem sondern eine Datenbank, meist /var/lib/locatedb. Diese Datenbank ist eine Textdatei, in der für jede Datei des Systems eine Zeile existiert. Die Datenbank wird mit dem Befehl updatedb aktualisiert. Meist wird die Aktualisierung, weil zeitaufwendig, per cron durchgeführt.
locate arbeitet schneller als find, ist aber nur so aktuell wie die Datenbank.
Weblinks
find(1)
– Linux-Manpage (Englisch)- GNU Findutils
Wikimedia Foundation.