Manchmal kann man sich in seinen eigenen Verzeichnissen und Dateien wie in einem Labyrinth verirren, da ist guter Rat teuer. Wie findet man bloß diese LaTeX-Datei von vorgestern wieder? Und wo sind nur wieder die Zip-Archive vom letzten Download hingeraten? Wenn die Kommandoaufrufe auch manchmal etwas kryptisch sind – find ist Dein Freund!

"… 8, 9, 10 – ich komme!"

Mit dem Befehl find findet man Dateien wieder – man kann verschiedene Suchkriterien angeben, wie z.B. Dateinamen, -größe, das Datum der Erstellung oder des letzten Zugriffs. Ein Blick in die man-Page zeigt, dass es unzählige Anwendungen für diesen Befehl gibt. Damit die Verwirrung nicht allzu groß wird, stellen wir hier die wichtigsten Optionen vor.

Tippt man einfach nur find, werden alle Dateien im aktuellen Verzeichnis und in allen Unterverzeichnissen gefunden. Sucht man dagegen nach einer ganz bestimmten Datei, lautet der Aufruf find -name dateiname. Wildcardssind möglich – allerdings muss dann der abgekürzte Dateiname in Apostrophen angegeben werden: find -name '*.tex' sucht alle Dateien, die mit .tex enden.

Auch die Option -type dateityp macht das Suchen und Finden oft leichter. Wenn man find -type f (für "file") verwendet, werden reguläre Dateien gesucht, -d (für "directories") sucht nach Verzeichnissen und -l nach Links.

GNU is not UNIX

Vorsicht auf anderen Unix-Systemen – der Aufruf von find sieht meistens etwas anders aus. Man muss dem Befehl schon sagen, wo er suchen soll, d.h. eine Pfadangabe ist unbedingt notwendig. Auch die Option -print sollte zusätzlich zum einfachen Aufruf verwendet werden, sonst wird gesucht, aber das Ergebnis nicht angezeigt. Beim GNU-find ist dieser Parameter die Standardeinstellung, sofern nicht mit -exec ein Kommando ausgeführt wird.

Möchte man nicht, dass alle Unterverzeichnisse durchsucht werden, kann man die Tiefe des durchsuchten Verzeichnisbaumes durch die Option -maxdepth levelanzahl einschränken. Der Aufruf find -maxdepth 1 bewirkt also, dass keine Unterverzeichnisse mehr berücksichtigt werden. Standardmäßig folgt find keinen durch Symlinks referenzierten Verzeichnissen. Will man auch solche durchsuchen, verwendet man den Parameter find -follow.

Noch spezieller, bitte!

Mit dem Befehl find lässt sich prima auch nach komplizierteren Dingen suchen. Hier kommt die gesamte Palette des Dateisystems zum Einsatz. Da man mit find immer nur die äußere Hülle der Dateien (also nicht ihren Inhalt) betrachtet, braucht man verschiedene Möglichkeiten, Dateiattribute anzugeben.

Ein Kriterium, nach dem man suchen kann, ist unter anderem die Zeit der letzten Veränderung. Mit dem Aufruf find - n kann man Dateien finden, die das letzte Mal vor genau n Tagen verändert wurden. Weiß man den Tag nicht mehr ganz so genau, kann man ein + oder ein - vor das n stellen: find -ctime +n sucht Dateien, die älter als n Tage sind, find -ctime -n Dateien, die entsprechend jünger sind.

Dateien, die einer bestimmten Gruppe von Usern gehören, kann man mit der Option -group gruppenname suchen, mit -user username werden Dateien gefunden, die einem bestimmten Benutzer gehören. Wird hingegen der Parameter -nogroup oder -nouser angehängt, werden nur solche Files gefunden, die keinem gültigen Benutzer oder keiner Gruppe des Systems (mehr) zuzuordnen sind.

Möchte man eine Einschränkung in der Dateigröße vergeben, verwendet man einfach die Option -size groesse. Die Angabe der groesse bezieht sich auf die Anzahl der Blöcke, die die Datei im Filesystem belegt, meistens sind diese 512 Byte groß. Auch hier kann man wieder mit dem + oder - Zeichen den Spielraum nach oben oder unten erweitern. Ein zusätzliches c oder k angehängt heißt, dass die Größe in Byte oder kByte angegeben wurde. Beispiel: find -size +5k findet Dateien, die größer als 5 kByte sind.

Der Parameter -path suchmuster bietet zusätzlich zur Suche nach Dateinamen, wie bei -name, die Möglichkeit, den Namen inklusive Pfad zu spezifizieren. find /home/huhn/ -path '*linux*/*.html' findet z.B. alle Dateien, die auf .html enden und in deren Pfad die Zeichenkette linux enthalten ist.

Spannend wird die Option -path in Zusammenhang mit dem Parameter -prune. Man sucht häufig nach Dateien, von denen man weiß, in welchem Verzeichnis sie ungefähr liegen könnten – aber man ist sich sicher, dass sie in gewissen Unterverzeichnissen auf keinen Fall liegen. Wer jemals in seinem Home-Verzeichnis nach GIF-Dateien gesucht hat, weiß, wovon ich rede.

huhn@huehnerstall ~ > find /home/huhn -path '*.netscape*' -prune -o -name '*.gif' -print

Das sieht schon recht kompliziert aus, aber gehen wir schrittweise vor. Im Home-Verzeichnis des Benutzers "Huhn" wird etwas gesucht, und zwar offenbar solche Objekte (Dateien / Verzeichnisse), deren Namen und Pfade die Zeichenkette .netscape enthalten. Das -prune bewirkt nun, dass von einem gefundenen Objekt der Dateibaum nicht weiter durchsucht wird. Für dieses Beispiel heißt das also, dass jedes Verzeichnis, das .netscape im Namen hat, übergangen wird. Für alle anderen greift nun der zweite Teil, hinter dem -o, d.h. von den verbleibenden Objekten werden diejenigen ausgegeben, die auf .gif enden.

Die gerade gezeigte Option -o sollte noch etwas näher betrachtet werden. Es handelt sich um einen ODER-Operator, der zwei Teilausdrücke verbindet. Es ist ein "entweder – oder", das versucht, den gesamten Ausdruck wahr zu machen. Ist der erste Teilausdruck schon wahr, so muss und wird der zweite Teilausdruck gar nicht mehr ausgeführt werden. Entsprechendes gilt für den AND-Operator -a: Hier wird der zweite Teilausdruck nicht ausgewertet, wenn der erste schon falsch war, da auch in diesem Fall der gesamte Ausdruck nicht mehr wahr werden kann.

Führ mich aus!

Außer den beiden Aktionen -prune und -print ist besonders -exec kommando ; hilfreich. Man kann so schnell und praktisch ein Kommando für alle gefundenen Dateien ausführen. Möchte man z.B. alle Dateien, die auf ~ enden, löschen, kann man find direkt auf diese Weise mit rm verbinden: find -name '*~' -exec rm '{}' ';'. Hier sollte man beachten, dass die geschweiften Klammern den gerade gefundenen File-Namen enthalten. Da geschweifte Klammern für viele Shells besondere Bedeutung haben, muss man sie z.B. durch Apostrophe vor einer Interpretation durch die Shell schützen. Dieses gilt auch für das Semikolon (;), das für das -exec-Kommando obligatorisch ist und dieses abschließt.

Gerade in Zusammenhang mit rm sollte man sich vielleicht erst das Ergebnis vom find-Aufruf ohne -exec anschauen und in einem zweiten Schritt die Befehle verbinden. Eine sinnvolle Kombination ist der Aufruf von find zusammen mit einem -exec grep, das nach Zeichenketten suchen kann.

Übrigens: Es ist nicht schlimm, wenn Sie vielleicht nicht sofort alle hier aufgezeigten Parameter des find-Befehls verinnerlichen können - auch wenn Sie anfänglich nur die elementarsten Parameter erlernen, werden Sie verschollene Dateien mit geringem Zeitaufwand finden.

Glossar

Wildcards

Sonderzeichen, die Teile von Zeichenketten unbestimmt lassen. Ein Fragezeichen ? in einer Zeichenkette lässt nur denjenigen Buchstaben dieser Zeichenkette unbestimmt (z.B. h?llo ==> hallo, hGllo, h7llo,…), an dem sich das Fragezeichen befindet, während ein * für beliebig viele verschiedene Zeichen steht (z.B. G*ss ==> Guss, Genuss).

ctime

Das ext2-Dateisystem von Linux speichert eine Vielzahl von Dateiinformationen ab, die als Suchkriterien dienen können, z.B. die Zeit (jeweils ausgedrückt als ein Vielfaches von 24 Stunden), die seit dem letzten Dateizugriff (atime), der letzten Statusänderung (ctime) oder der letzten Dateiinhaltsänderung (mtime) vergangen ist.

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Related content

Kommentare