find

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

find (zu deutsch finde) ist der Name eines UNIX-Programms zum Auffinden von Dateien und Verzeichnissen innerhalb der Verzeichnisstruktur. 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, dieser durchsucht jedoch den Inhalt von Dateien. Bei den Unixvarianten wird die inhaltliche Suche mit grep realisiert.

Benutzung[Bearbeiten]

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 +12000c

findet also alle Dateien des gesamten Verzeichnisbaums, die auf .txt enden und größer als 12000 Byte sind.

Numerische Werte[Bearbeiten]

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 24000c

findet z.B. alle Dateien, die genau 24000 Byte groß sind. Ein Minus ist mit dem mathematischen Operator < gleichzusetzen. Bei folgendem Befehl werden also alle Dateien gefunden, die kleiner als 24000 Byte sind:

find . -size -24000c

Umgekehrt findet ein + alle Dateien, die > dem Wert sind.

find . -size +24000c

findet also alle Dateien, die größer als 24000 Byte sind.

exec[Bearbeiten]

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

execplus[Bearbeiten]

Wenn man nicht für jede gefundene Datei ein neues Kommando starten will, dann verwendet man den Befehl:

find / -nouser -exec rm {} +

Das find-Kommando sammelt dabei solange Dateinamen bis die Längenbegrenzung für die Argumentliste erreicht ist. Das Leerzeichen, das Zeilenende und ähnliche Zeichen in Dateinamen werden dabei korrekt an das Programm rm übergeben.

Weitere Suchprogramme[Bearbeiten]

Unter Unix gibt es weitere Suchprogramme, Die GNU Findutils fassen diese zu einem Paket zusammen.

locate[Bearbeiten]

locate funktioniert ähnlich wie find, durchsucht aber nicht das Dateisystem sondern eine Datenbank, meist /var/lib/locatedb. Diese Datenbank ist eine Datei, in der für jede Datei des Systems ein Eintrag existiert. Die Datenbank wird mit dem Befehl updatedb aktualisiert. Meist wird die zeitaufwendige Aktualisierung, per cron durchgeführt.

locate arbeitet schneller als find, ist aber nur so aktuell wie die Datenbank.

xargs[Bearbeiten]

Mit xargs können die von find erhaltenen Suchergebnisse weiter verarbeitet werden.

Eine Möglichkeit, Dateien mit bestimmtem Inhalt zu suchen und dabei Probleme durch Dateinamen mit Leer- oder Sonderzeichen zu vermeiden, erhält man etwa durch folgende Befehlsfolge:

find "/zu/durchsuchender/Ordner" -name "beispieldatei*" -print | xargs -0 grep -l "Beispielinhalt"

Weblinks[Bearbeiten]