Dateien suchen mit find

Aus Gentoo Linux Wiki

Wechseln zu: Navigation, Suche
Dieser Artikel ist Teil der TIPPs & Tricks Sammlung.
Terminals / Shells X Portage System Dateisysteme Kernel Netzwerk Sonstiges alphabetischer Tipp Index


Inhaltsverzeichnis

[Bearbeiten] Einleitung

In unixoiden Umgebungen kommt man oft in Situationen, die ein automatisches Filtern eines Verzeichnisses oder einer Verzeichnishierarchie verlangen. Will man beispielsweise in einer Sammlung von Urlaubsfotos die vereinzelten Bitmaps endlich nach JPEG konvertieren, so erscheint das manuelle Durchsehen aller Fotoverzeichnisse sehr mühsam. Einfacher ist es, ein Programm zu benutzen, welches die Bilder nach frei wählbaren Kriterien filtert und nur die Dateien anzeigt, die wirklich gewünscht sind.

[Bearbeiten] find

Das nützliche Werkzeug find bietet die Möglichkeit Verzeichnisse nach bestimmten Dateien zu durchsuchen, nicht nur anhand ihres Namens sondern auch mit verschiedenen anderen Kriterien, sogenannten Tests. Darüberhinaus lassen sich mit den Suchergebnissen verschiedene Aktionen ausführen.

[Bearbeiten] Syntax

$ find [Verzeichnis/Dateien] [-Option...] [-Test...] [-Aktion...]

Das Verzeichnis-Argument entspricht standardmäßig dem aktuellen Verzeichnis und kann ausgelassen werden. Ebenso sorgt das Weglassen der Tests dafür, dass alle Dateien und Verzeichnisse im Verzeichnis und in den Unterverzeichnissen angezeigt werden. Die einfachste Methode, find zu verwenden ist also:

$ find

[Bearbeiten] Tests

Zur einfachen Übersicht werden nun einige nützliche find-Kommandos erklärt:

$ find -name '*Bob Dylan*'

Gibt alle Dateien und Verzeichnisse aus, die "Bob Dylan" im Namen enthalten.

$ find -maxdepth 0 -name '*.gz'

Die Option -maxdepth N beendet den Suchvorgang nach N Rekursionen, d.h. nach dem N-ten Abstieg in ein Unterverzeichnis. -maxdepth 0 bewirkt also eine Suche nur in den angebenen Verzeichnissen und Dateien. Mit dem genannten Kommando lässt sich kein Ergebnis erzeugen, außer das aktuelle Verzeichnis endet auf .gz. Zum Durchsuchen der im aktuellen Verzeichnis befindlichen Dateien muss entweder -maxdepth erhöht oder die Suchorte erweitert werden:

$ find -maxdepth 1 -name '*.gz'
$ find * -maxdepth 0 -name '*.gz'

Um mehrere Kriterien abzufragen, lassen sich die Tests mittels logischer Operatoren verknüpfen. UND-Verknüpfungen erzeugt man mittels -and, -a oder ohne einen Operator, ODER-Verknüpfungen entsprechend mit -or und -o. Negationen erreicht man mit -not.

$ find -name '*Marley*' -or -name '*Dylan*'
$ find -name '*Bob*' -and -name '*.mp3'

[Bearbeiten] Weitere Tests

Andere sinnvolle, oft angewandte Tests beziehen sich auf die Dateigröße oder das Datum der letzten Änderung.

$ find -size +1000k

Ist die Datei größer als 1000KB? Bei numerischen Argumenten, wie bei -size, -ctime oder -amin lässt sich stets ein + oder ein - anfügen, um alles größer oder kleiner als den gefragten Wert zu suchen. Ohne Vorzeichen wird nach dem exakten Wert gesucht.

$ find -ctime +2

Ist die Datei vor mehr als 2 Tagen (+N * 24 Stunden) geändert worden?

$ find -amin -60

Ist auf die Datei vor weniger als 60 Minuten zugegriffen worden? Die {a,c,m}{min,time}-Funktionen als Kriterien der Datei-Attribute sind m.E. sehr einprägsam mittels der Eselsbrücke {accessed,created,modified}, obwohl die Ergebnisse kaum das wahre Erstellungsdatum zeigen, sondern die Inode change time. Hinzu kommen die erwarteten Argumenten N*min oder N*24h und eben blos nicht das + oder - vergessen.

$ find -empty

Ist die Datei oder das Verzeichnis leer?

$ find -type f

Diese sehr nützliche Abfrage liefert nur Ergebnisse des Typs "Datei". -type d entspräche dem Verzeichnis, -type l dem symbolischen Link.

[Bearbeiten] Aktionen

Die wohl meist benutzte Aktion ist -exec. Mit ihr lassen sich beliebige Befehle auf jeden Treffer anwenden.

$ find -type f -exec chmod 640 "{}" \;

Die beiden geschweiften Klammern {} werden durch das aktuelle Suchergebnis ersetzt. Am Ende des -exec-Befehls sollte die Befehlszeile mittels \; beendet werden. Auf diese Weise lassen sich beispielsweise relativ einfach die Zugriffsrechte aller Dateien und aller Verzeichnisse ändern, ebenso könnte man alle Dateien, die auf .mp3 enden, mit XMMS o.Ä. abspielen.

$ find -type d -exec chmod 750 "{}" \;
$ find -type f -name '*.mp3' -exec xmms -e "{}" \;

[Bearbeiten] Literatur

$ man find

manpage auf Deutsch

'Persönliche Werkzeuge