claim.gif
Linux Magazin Linux User Easy Linux Ubuntu User International Linux Community
Erschienen in EasyLinux 01/2004   »   Ausgabe bestellen

Dateisuche mit find

Meisterdetektive

von Elisabeth Bauer


Eigenwillig und mächtig ist der Dateifahnder der Shell. Das Guru-Training verrät, wie Sie mit "find" erfolgreich suchen.

Meisterdetektive, das erfährt man in Krimis, haben ihre Macken: Der eine säuft zu viel, der andere raucht zwischendurch ein Opiumpfeifchen, und fast alle sind sie Singles. Wer einmal mit dem Meisterdetektiv der Shell, dem Dateisuchbefehl find gespielt hat, kann das bestätigen: Nur allzu oft präsentiert das Kommando statt der gewünschten Treffer kryptische Fehlermeldungen. Der Umgang mit find ist nicht einfach, aber hat man seine Grundprinzipien verstanden, ist es ein mächtiges und effizientes Werkzeug zur Dateisuche.

Ohne Argumente aufgerufen, "findet" find alles, was unterhalb des aktuellen Verzeichnisses liegt und wirft es aus -- macht also fast das Gleiche wie ein ls -aR. Haben Sie den Befehl in Ihrem Home-Verzeichnis eingegeben, kann die Liste ganz schön lang werden -- mit [Strg-C] stoppen Sie die verirrte Spürnase.

Namensfahndung

Deutlich sinnvoller ist es, die Suche auf bestimmte Kriterien einzuschränken. Das ist einfach, wenn Sie sich noch an den vollen Namen der Datei erinnern.

find . -name poirot.jpg

spürt beispielsweise poirot.jpg, ein Bild des eigenwilligen französischen Privatdetektivs, auf. Der Punkt weist find an, alle Ordner ab dem aktuellen Verzeichnis zu durchwühlen. Stattdessen können Sie auch den Ort, an dem find suchen soll, genau angeben:

find /mnt/cdrom/bilder -name poirot.jpg

Dieser Befehl durchsucht das Verzeichnis bilder einer nach /mnt/cdrom gemounteten CD (unter SuSE Linux wäre das /media/cdrom). Die Unterordner schließt find immer automatisch in die Suche mit ein.

Wissen Sie nicht mehr, ob Sie den großen Detektiv beim Speichern der Datei groß oder klein geschrieben haben, hilft die Option -iname weiter:

find . -iname holmes.jpg

zeigt an, wo sich der englische Exzentriker auf der Festplatte versteckt -- egal, ob er den Decknamen Holmes.jpg, HOLMES.jpg oder hOLMEs.jpg verwendet.

Der Ärger mit den Wildcards

Wenn Sie nur noch Teile des Dateinamens kennen, wird es schwieriger. Erinnern Sie sich noch an die Wildcards oder Jokerzeichen? Das sind die praktischen Zeichen * und ?, die für beliebige Zeichen stehen und die die Shell zu vollständigen Dateinamen ergänzt. So kopieren Sie beispielsweise mit cp *.jpg bilder/ alle Dateien mit der Endung .jpg im aktuellen Verzeichnis in den Ordner bilder.

Doch wer dieses Feature mit find benutzt, fällt dabei leicht auf die Nase. Der Befehl

find . -name blo*

tut zwar manchmal das Gewünschte, in vielen Fällen produziert er jedoch nur die nicht sehr erhellende Fehlermeldung:

find: Der Pfad muss vor dem Suchkriterium stehen.
Syntax: find [Pfad...] [Suchkriterium]

Schuld daran ist die Shell, die die Jokerzeichen auflöst. Wenn Sie diesen Befehl eingeben, geschieht intern Folgendes: Die Shell nimmt den Wildcard-Ausdruck blo* und sucht im aktuellen Verzeichnis Dateien, die darauf passen. Findet Sie dort blog.txt und blondinen.txt, setzt sie diese in Ihren Befehl ein und reicht das Ganze an find weiter. Der tatsächlich ausgeführte Befehl sieht also aus: find . -name blog.txt blondinen.txt. Damit kann find nichts anfangen und beschwert sich.

Solche Probleme umgehen Sie, in dem Sie Suchausdrücke, die Wildcards enthalten, "quoten", d. h. in Anführungszeichen setzen. Damit reicht die Shell den Ausdruck unverändert an find weiter, der jetzt wie gewünscht überall nach Dateien fahndet, auf die Ihr Suchausdruck passt. Korrekt heißt es also

find . -name "blo*"

Mit diesem Kommando zeigt find nicht nur blog.txt und blondinen.txt an, sondern auch den in einem Unterverzeichnis untergetauchten Jungdetektiv blomquist.jpg (siehe Abbildung 1).

Abb. 1: Kleine Anführungszeichen, großer Unterschied. Nur mit Anführungszeichen macht sich find auf die Suche nach allen Dateien, die mit "blo" beginnen.

Wie jeder gute Detektiv verlässt sich find nicht nur auf Namen, sondern beherrscht auch die Suche nach anderen Indizien, die Sie beliebig kombinieren können.

Große Dateien fischen Sie mit der Option -size heraus:

find . -size +1000k

zeigt alles an, was größer als 1000 KB ist. Lassen Sie das Pluszeichen weg, sucht find nach Dateien mit genau der angegebenen Größe, mit einem Minuszeichen (zum Beispiel -50k) setzen Sie einen Maximalwert.

Praktisch ist auch die Option -mtime ("modification time"=Änderungszeit). find . -mtime 0 präsentiert alles, was sich in den letzten 24 Stunden geändert hat, -mtime 2 die geänderten Dateien der letzten zwei Tage. Genauere Zeitangaben setzen Sie mit der Option -mmin in Minuten.

find . -mmin -5

findet alle Dateien, die in den letzten 5 Minuten geändert wurden.

Sie wollen nur Verzeichnisse finden oder nur Dateien anzeigen? Auch das klappt mit find. Mit -type beschränken Sie die Suche auf bestimmte Typen: find . -type d für Verzeichnisse ("directory"), f für Dateien ("file") oder l für symbolische Links.

Exekutive

Manchmal will man die gefunden Dateien auch bearbeiten. Dazu bringt find die Option -exec mit, mit der Sie über den Fundstücken ein beliebiges Kommando ausführen. Mit dessen kryptischer Syntax kann sich nicht jeder anfreunden. Falls Sie also nach dem folgenden Abschnitt meinen, dass Sie sich an so etwas nie gewöhnen können: Lesen Sie nicht weiter, vergessen Sie, dass es die Option -exec gibt und benutzen find einfach als praktisches Suchwerkzeug.

find . -name "*.txt" -exec less "{}" ";"

Dieser Befehl reicht alle Dateien mit der Endung .txt an den Pager less weiter, in dem Sie gemütlich mit der Leertaste blättern und mit q zur nächsten Datei springen. In die geschweiften Klammern ({}) setzt find nacheinander die Dateinamen ein, der Strichpunkt markiert das Ende des Befehls. Auch hier sind wieder Anführungszeichen nötig, da die Klammern und der Strichpunkt auch für die Shell eine besondere Bedeutung haben.

Wer nicht blindlings losschlagen will -- sehr zu empfehlen bei Befehlen, die Dateien nicht nur anzeigen, sondern ändern -- benutzt statt -exec die Option -ok. find präsentiert nun jede gefundene Datei zusammen mit dem Kommando und fragt Sie nach Bestätigung. Nur wenn Sie y (unter SuSE Linux auch j) eingeben, führt es die Aktion aus. Drücken Sie [Eingabe] oder ein beliebiges anderes Zeichen, überspringt es die Datei. So löschen Sie beispielsweise Sicherheitskopien mit der Endung .save:

find . -name "*.save" -ok rm "{}" ";"

oder kopieren mit

find /mnt/cdrom/ -name "*.jpg" -ok cp "{}" /home/tux/bilder/ ";"

alle .jpg-Dateien auf einer gemounteten CD in das Verzeichnis bilder. Eine eventuelle Ordnerstruktur auf der CD bildet dieser Befehl jedoch nicht nach. Liegen auf der CD in Unterordnern gleichnamige Bilder, kopiert er sie alle übereinander. Sowohl rm, als auch die Kommandos cp und mv sind in Kombination mit -exec mit Vorsicht zu gebrauchen. (eba)

find-Optionen in Kürze
  • -name muster alles mit dem Namen muster
  • -size +xxk alles, was größer als xx KB ist.
  • -mtime 0 alles, was in den letzten 24 Stunden geändert wurde.
  • -type d suche nach Verzeichnissen
  • -type f suche nach Dateien
  • -type l suche nach symbolischen Links
  • -exec befehl "{}" ";" führe befehl über alle gefundenen Dateien aus
  • -ok befehl "{}" ";" führe befehl nach Bestätigung mit y aus.

Dieser Online-Artikel kann Links enthalten, die auf nicht mehr vorhandene Seiten verweisen. Wir ändern solche "broken links" nur in wenigen Ausnahmefällen. Der Online-Artikel soll möglichst unverändert der gedruckten Fassung entsprechen.

Druckerfreundliche Version | Feedback zu dieser Seite | Datenschutz | © 2017 COMPUTEC MEDIA GmbH | Last modified: 2007-01-25 16:45

Nutzungsbasierte Onlinewerbung

[Linux-Magazin] [LinuxUser] [Linux-Community] [Admin-Magazin] [Ubuntu User] [Smart Developer] [Linux Events] [Linux Magazine] [Ubuntu User] [Admin Magazine] [Smart Developer] [Linux Magazine Poland] [Linux Community Poland] [Linux Magazine Brasil] [Linux Magazine Spain] [Linux Technical Review]