HINWEIS: Dieses Dokument wurde in HTML Version 5 erstellt. Möglicherweise wird es von einigen älteren Browsern und dem Internet Explorer nicht korrekt angezeigt.

10 Tipps zum Einsatz von GNU-find

Das GNU-Dienstprogramm find ist eines der nützlichsten Befehle. Auf den ersten Blick scheinen die Optionen und Syntax geheimnisvoll. Aber mit ein wenig Übung wirst du in der Lage sein, jede Datei auf deinem System ganz leicht zu finden. Für den Einstieg haben wir 10 Möglichkeiten zum Einsatz von find, damit du findest, was du suchst.

Beachte, dass nicht alle Versionen gleich sind. Der Befehl find ist unter Linux etwas anders als auf BSDs, Solaris oder Mac OS X. Ein Großteil der Syntax von find ist gleich und kann auf allen Systemen verwendet werden, aber nicht vollständig.

Grundlegende Verwendung

Beginnen wir mit dem Grundlagen. Wenn du eine Datei suchst und kennst den Namen der Datei - nur nicht den Ort wo du sie abgelegt hast - dann ist die Syntax einfach. Lass find einfach nach dem speziellem Namen suchen:

find -name filename

Angenommen filename existiert, dann wird find den Speicherort der Datei/Dateien anzeigen. Wie etwa hier:

jzb@kodos:~$ find -name filename
./projects/filename
jzb@kodos:~$

Dateien nach Größe suchen

Manchmal ist es nützlich, andere Attribute zur Suche zu verwenden. Etwa Dateien nach Größe zu finden. Ein gutes Beispiel: du arbeitest mit einem Server und stellst fest, dass eine der Partitionen beginnt, voll zu werden. Um welche Datei, oder Dateien, handelt es sich? Mit find suchst du Dateien nach Größe und kannst dich dann darum kümmern, Platz zu schaffen.

Die Option um nach Größe zu prüfen ist -size, gefolgt von der Größenangabe, nach der du suchst. Du kannst alle möglichen Einheiten angeben, von Blöcken (b) bis Gigabytes (G). Um Dateien der Größe 100 kB zu finden, gibst du ein:

find -size 100k

Damit werden alle Dateien der Größe 100 kB gefunden. Das ist ziemlich speziell. Um größere oder kleinere Dateien einer bestimmten Größe zu finden, verwendest du + oder - zusätzlich zur Zahl. Also sollte find -size +100k alle Dateien größer als 100 kB zurückgeben. Und find -size -100k alles was kleiner ist.

Mit dem -empty-Parameter kannst du auch leere Dateien finden:

find -empty -type -f 

Beachte, dass ich eine zusätzliche Prüfung für den Typ der Datei verwende. Ohne diese Option wird find Verzeichnisse als „leere Dateien“ anzeigen.

Dateien nach Benutzer suchen

Ein weiterer nützlicher Einsatz von find ist es, Dateien nach Besitzerstatus zu lokalisieren, sogar Dateien mit fehlendem Besitzer. Schauen wir uns das mal an. Wenn du Dateien zwischen Systemen verschoben hast, oder wenn du Benutzer entfernt hast, hast du möglicherweise verwaiste Dateien. Um solche zu finden nimmst du:

find -nouser

Um Dateien, die tatsächlich im Besitz eines bestimmten Benutzers sind, zu finden, nimmst du die -user oder -uid Optionen. Die -uid Option erlaubt dir nach der nummerischen User-ID (UID) zu suchen und -user erlaubt dir nach Name oder UID zu suchen. Also wenn ich alle meine Dateien in einem Verzeichnis finden will benutze ich find -user jzb. Oder ich könnte find -user 1000 oder find -uid 1000 eingeben.

Vielleicht suchst du die Dateien die Benutzer A oder B gehören. Das kannst du erreichen indem du den Operator -o hinzufügst:

find -user root -o -user www-data

Damit werden alle Dateien gefunden die Benutzer root oder www-data gehören. Wenn du umgekehrt alle Dateien finden möchtest die nicht dem bestimmten Benutzer gehören, nimmst du den -not-Operator:

find -not -user www-data

Natürlich funktioniert -not auch zusammen mit anderen Optionen. Du könntest nach allen Dateien suchen die einem Benutzer gehören, die nicht mehr als eine bestimmte Größe haben. Beispiel:

find -user www-data -not -size +100k

Dateien nach Gruppen suchen

Eine weitere Möglichkeit, nach Dateien zu suchen ist nach Gruppe, mit der -group-Option. Diese Option arbeitet mit einem Gruppennamen oder einer Gruppen-ID (GID). Die grundlegende Syntax ist find -group groupname.

Natürlich kannst du das mit anderen Operatoren kombinieren. Das könnte nützlich sein, wenn du versuchst, alle Dateien eines bestimmten Benutzers, die auch zu einer bestimmten Gruppe gehören, zu finden.

Dateien nach Berechtigung suchen

Gelegentlich möchtest du dein Dateisystem nach Dateien überprüfen, die global beschreibbar sind, oder sonstige „falsche“ Berechtigungen haben. Das find-Werkzeug unterstützt dies mit mehreren verschiedenen Optionen. Am einfachsten sind die Operatoren -readable, -writable, und -executable. Diese prüfen die Berechtigungen des aktuell angemeldeten Benutzers, der find aufruft. Beachte, dass diese Optionen in älteren Versionen von find nicht verfügbar sind. Also wenn deine Distribution etwas älter ist hast du diese Optionen eventuell noch nicht.

Ein andere Option nach der Dateiberechtigung zu suchen ist die Benutzung von -perm, was nach dem aktuellen Dateistatus schaut. Auf diese Art kannst du sehen ob eine Datei mit einer bestimmten Kombination von Berechtigungen übereinstimmt. Zum Beispiel wenn du sehen willst welche Dateien von Benutzer und Gruppe ausführbar sind, nimmst du:

find -type f -perm -110

Die 110 sagt find „Schau nach Dateien das Ausführen-Bit für Benutzer und Gruppe gesetzt haben!“ und das - sagt find die anderen Bits zu ignorieren. Das heißt, es spielt keine Rolle, wenn die Datei auch beschreibbar oder lesbar ist, solange die Bits gesetzt sind, die sie ausführbar machen.

Um die Suche auf Dateien einzuschränken, die exakt dem angegeben Staus entsprechen, benutzt du nicht den - -Operator.

Was, wenn du nach Dateien suchst die das Ausführen-Bit für Benutzer oder Gruppe haben? Dann nimmst du / statt - :

find -type f -perm /110

Jede Datei, die die Gruppen- oder Eigentümer-Berechtigung hat, wird gefunden.

Suchen nach Berechtigung kann überaus hilfreich sein, aber auch komplex. Es kann etwas dauern um die Syntax zu verstehen, besonders für die, die noch nicht mit dem Eigentümer/Berechtigung-Konzept vertraut sind. In diesem Fall ist das Lesen der man-Seiten nicht nur empfehlenswert, sondern unerlässlich.

Reguläre Ausdrücke verwenden

Manchmal brauchst du "regular expressions - RegEx" (Reguläre Ausdrücke). Selbstverständlich unterstüzt find diese — vielleicht mehr als du erwartest. find hat nicht nur einfach RegEx-Support, es beherrscht auch mehrere unterschiedliche Arten der RegEx-Syntax. Mit -regextype und eine der unterstützten Arten wie posix-awk, posix-egrep, usw. kannst du den Typ wählen. Lies unter man find nach, welche Arten unterstüzt werden.

Ein kurze Beispiel. Sagen wir ich suche alle Dateien die entweder eine .php oder .js Endung. Ich könnte das folgende laufen lassen:

find -regextype posix-egrep -regex '.*(php|js)$'

Das sieht etwas kompliziert aus, oder? Runtergekürzt weist es an, die egrep-Syntax -regextype posix-egrep zu benutzen und hinten kommt der Reguläre Ausdruck nach dem gesucht wird. Der Ausdruck beginnt und endet mit einem Hochkomma, damit die Shell nicht versucht die RegEx auszuwerten. Der Ausdruck .* ist ein Joker und bedeute „ein oder mehr beliebige Zeichen“. (php|js) weist an nach php oder js zu suchen. Die Pipe (|) steht hier für "oder". Das Dollarzeichen "$" hinten weist an, den Ausdruck am Ende eines Strings zu suchen. Also trifft etwa eine Datei namens js.txt nicht auf die Abfrage zu.

Wie bei den Berechtigungen, können reguläre Ausdrücke kompliziert sein. Wir wollen in einem späteren Tutorial darüber berichten. Bis dahin schaue in der Man-Page und der Dokumentation zu find nach.

Working with Times

What if you want to find files by their age? This is something that can be useful if you're trying to find a file that you know you created within a certain timeframe, or if you want to look for older files to delete. Lots of good reasons, actually.

The find utility is all about finding by time. You can search by access time (-atime) or the last time a file was modified (-mtime) or by the last time it was changed (-ctime).

For example, let's look for any files that have not been modified in the last two days:

find -mtime +2

The options take a number that is interpreted as "n times 24 hours ago" and actually encompass a range. If you say +1, find will interpret that as "at least 24 hours ago, but not more than 48 hours ago."

You can combine the options, if you want to look for files within a specific range. So find -mtime +2 -mtime -5 would be "two or more days ago, but not more than five days ago."

Working with Minutes

Sometimes you need to look for files modified in the last day or so, and the previous options are a bit too broad for that. The good news is that find also has the -amin, -cmin, and -mmin, which are similar to the other options but they work with minutes rather than days. So if you want to look for something that was changed or accessed in the last day, you can use those options.

Limit Searches

Sometimes find provides more results than you need, or want. You can limit find results by using the -maxdepth option. For example, if you wanted to find every JavaScript file in your wordpress directory, you would use this:

find wordpress -name '*js'

But what if you only want to see if there are any JavaScript files in the top-level directory? You can limit that with -maxdepth:

find wordpress -maxdepth 1 -name '*js'
    

That will only search the wordpress directory, but not any of the subdirectories. Changing the -maxdepth to 2 would search subdirectories in the wordpress directory, but it would exclude their subdirectories.

Combining find with Other Commands

Now that you've found the files you're looking for, what are you going to do with them? You can use find in conjunction with xargs or the -exec option to manipulate files after you've found what you're looking for.

Say you want to change the ownership of a bunch of files from root to www-data. Finding all the files is only the first step; you also need to change the ownership. Doing it manually from a list of files returned by find sounds like tedium, and it is. So you might want to use the -exec option to change the ownership:

find -user root -exec chown www-data {} \;

That command tells find to pass all the files it finds to the chown utility and change the ownership to www-data. Piece of cake.

Zusammenfassung

Das Werkzeug find zu kennen ist ein Muss für jeden Linux-User der sein System beherrschen möchte. Auf dem Desktop kommt man vielleicht ohne find aus, aber für die Systemadministration musst du mit find umgehen können. Bevor du mit -exec und xargs Änderungen machst oder Dateien löschst, teste dein Kommando, um sicher zugehen das es wie erwartet funktioniert.

Hast du Tipps zu find die du mit der Linux-Community teilen möchtest? Bitte schreib dein Kommentar auf www.linux.com.