12.2. find: Sucht Dateien nach bestimmten Kriterien

find ist ein traditionelles Unix-Programm. Es dient zum rekursiven Suchen von Dateien nach bestimmten Kriterien in einem oder mehreren Verzeichnissen. Es ist wirklich nützlich, die Syntax verlangt allerdings etwas Übung:

find [Optionen] [Verzeichnisse] [Kriterium] [Handlung]

Geben Sie kein Verzeichnis an, durchsucht find das aktuelle Verzeichnis. Geben Sie das Kriterium nicht an, gilt sein Wert als ,,wahr`` und alle Dateien werden gefunden. Die Optionen, Kriterien und Aktionen sind so mannigfaltig, dass hier nur wenige erwähnt werden können. Die Optionen:

Ein Kriterium kann einen oder mehrere atomare Tests umfassen. Einige nützliche Tests:

Es gibt noch eine Menge anderer Tests, wie Sie im Handbuchauszug zu find nachlesen können. Sie können Tests auch miteinander kombinieren:

Schließlich können Sie noch Aktionen für gefundene Dateien angeben. Oft benutzt werden:

Noch da? Gut – ein bisschen Übung wird Ihnen helfen, sich mit diesem Monsterkommando zurechtzufinden. Angenommen, Sie möchten eine Liste der Verzeichnisse in /usr/share erhalten, dann tippen Sie:

find /usr/share -type d

Angenommen, Sie haben einen HTTP-Server und alle Ihre HTML-Dateien befinden sich in /home/httpd/html, wo Sie sich auch gerade befinden. Sie möchten eine Liste aller Dateien, deren Inhalt seit einem Monat nicht verändert worden ist. Da die Seiten von verschiedenen Schreibern stammen, enden einige auf html und einige auf htm. Sie möchten diese Dateien in das Verzeichnis /home/httpd/obsolete verknüpfen. Geben Sie folgendes ein:[1]

find \( -name "*.htm" -o -name "*.html" \) -a -ctime -30 -exec 
ln {} /home/httpd/obsolete \;

Gut, das hier ist etwas komplex und verlangt nach Erklärung. Das Suchkriterium ist Folgendes:

\( -name "*.htm" -o -name "*.html" \) -a -ctime -30

Es findet alle Dateien, die entweder auf .htm oder auf .html enden (( -name "*.htm" -o -name "*.html" )) und (-a) die in den letzten 30 Tagen nicht modifiziert wurden (-ctime -30). Beachten Sie die Klammern, die hier notwendig sind, da -a eine höhere Wertigkeit hat. Ließen Sie sie weg, würde das Kommando alle Dateien mit der Endung .htm finden sowie die Dateien, die auf .html enden und seit einem Monat nicht modifiziert wurden. Beachten Sie auch, dass die Klammern vor der Shell geschützt wurden. Gäben Sie ( .. ) anstelle von \( .. \) ein, würde die Shell versuchen, diese zu interpretieren und das Kommando -name "*.htm" -o -name "*.html" in einer Sub-Shell auszuführen. Sie können diesen Schutz übrigens auch durch Anführungszeichen erreichen.

Und schließlich das Kommando, das für jede gefundene Datei ausgeführt wird:

-exec ln {} /home/httpd/obsolete \;

Auch hier müssen Sie das ; vor der Shell schützen, da diese es sonst als Kommandoseparator interpretiert und find sich beschweren wird, dass -exec ein Argument fehlt.

Ein letztes Beispiel: Sie haben ein großes Verzeichnis mit allen möglichen Bilddateien: /shared/images. Normalerweise benutzen Sie touch, um den Zeitstempel einer Datei namens stamp in diesem Verzeichnis aufzufrischen, um eine Zeitreferenz zu haben. Sie wollen eine Liste aller JPEG-Dateien, die jünger als die Datei stamp sind. Da Sie die Dateien von verschiedenen Quellen haben, haben Sie die Endungen jpg, jpeg, JPG oder JPEG. Sie möchten nicht im Verzeichnis old suchen, Sie möchten diese Liste zugeschickt bekommen und Ihr Benutzername ist john:

find /shared/images -cnewer     \
     /shared/images/stamp       \
     -a -iregex ".*\.jpe?g"     \
     -a -not -regex ".*/old/.*" \
       | mail john -s "Neue Images"

Und das war's! Nun wäre es nicht sehr schön, dieses Kommando regelmäßig neu eingeben zu müssen, also brauchen Sie...:

Fußnoten

[1]

Denken Sie daran, dass in diesem Beispiel beide Verzeichnisse auf dem selben Dateisystem sein müssen!


Tux on Star from MandrakeSoft Linux ist ein eingetragenes Warenzeichen von Linus Torvalds. Alle anderen Warenzeichen und Copyrights sind das Eigentum ihrer Inhaber.
Sofern nichts anderes Angaben ist, unterliegen die Inhalte der Seiten sowie alle Bilder dem Copyright von MandrakeSoft S.A. und MandrakeSoft Inc. 2000.
http://www.linux-mandrake.com/