Einführung in die Shell-Programmierung

Shells

Suchen


Einer der mächtigsten und nützlichsten Befehle in Linux (und Unix) ist wohl der find-Befehl. Allerdings gehört er auch zu den Befehlen, die sich nicht so leicht für den Anfänger erschließen.

Die Syntax lautet:

find path operators

mit path ist der Pfad oder das Verzeichnis gemeint, in dem die Suche beginnen soll. Mit Hilfe der Operatoren (operators oder besser Optionen) definiert man, was man eigentlich sucht und was mit den gefundenen Dateien gemacht werden soll.

Suche nach Dateien

Schauen wir uns find einmal an einem einfachen Beispiel an:

find /home/peter -name "brief.txt" -print

Obiger Befehl bewirkt, wenn man ihn auf einer Shell abschickt, dass ab dem Verzeichnis /home/peter nach der Datei "brief.txt" gesucht wird und das Ergebnis über stdout ausgedruckt wird. Die Suche geht auch rekursiv in alle Unterverzeichnisse ab der Startposition.

Suche nach Benutzern oder Benutzergruppen

Statt nach einem bestimmten Dateinamen, kann man sich auch alle Dateien eines bestimmten Benutzers ab einer bestimmten Startposition suchen lassen. Im nächsten Beispiel sucht unser hypothetischer User "peter" nach Dateien seiner Frau "Helge", die sich innerhalb seines Homeverzeichnisses befinden:

find /home/peter -user helge -print

Ebenso funktioniert auch die Suche nach einer Benutzergruppe. Im nächsten Beispiel nach der Gruppe "team":

find /home  -group team -print

Suchen mit Wildcards

Bei der Suche kann man auch Wildcards benutzen, so findet man z.B. mit folgendem Aufruf alle Dateien in denen der String Brief vorkommt:

find /home/peter -name "*brief*" -print

Obiger Aufruf würde zum Beispiel folgende Dateien finden:
brief1.txt
brief_an_helgt.tex
neuer_brief_peter.txt

Verknüpfung von Suchkriterien


Mit Hilfe des Operators -o kann man auch verschiedenen Suchkriterien mit "oder" verknüpfen:

find /home/peter -name "*.txt" -o -name "*.tex" -print

Obiger Befehl findet also alle Dateien, die die Endung txt oder tex haben.

Mit -a werden Kriterien "und" verknüpft.

Suchen nach Entstehungs- oder letzter  Zugriffszeit

Nehmen wir an, dass wir im aktuellen Verzeichnis alle Dateien finden wollen, die vor genau drei Tagen erzeugt worden sind.

find . -mtime 3 -print

Prinzipiell macht dies obiges Kommando, aber darin ist eine Falle versteckt, auf die die wenigsten Bücher aufmerksam machen. Tage heißt in diesem Tag nicht Kalendertage, sondern 24-Stunden Intervalle ab der aktuellen Uhrzeit. Nehmen wir an, dass wir gerade 18.20 Uhr an einem 15. eines Monats haben. Dann bewirkt obiger Aufruf, dass alle Dateien gefunden werden, die zwischen 18.20 Uhr am 11. und 18.20 am 12. erzeugt worden sind.

Analog dazu funktioniert -atime, nur dass dabei alle Dateien gefunden, auf die innerhalb des entsprechenden Zeitraums zugegriffen worden ist.

Eine andere Aufgabe: Stellen wir uns vor, dass wir aus einem Verzeichnis "books" alle Dateien, die innerhalb der letzten 24 Stunden geändert wurden, mittels tar archivieren wollen bzw. müssen:

tar cvjf new.tbz2 `find books -mtime 0 -a -type f`

Im obigen Befehl dient die Option "-type f" dazu, dass nur Dateinamen ausgegeben werden.

Nun wollen wir alle Dateien mit den Endungen  cpp und h  finden, die wir innerhalb der letzten 24 Stunden geändert haben:

find -mtime 0 -a \( -name "*.cpp" -o -name "*.h" \)

Suchen und Ausführen von Kommandos

So zum Schluss dieser Abhandlung - find kann natürlich weitaus mehr - noch der exec-Operator. Mit Exec kann man alle Linux- bzw. Unix Shell-Befehle auf die gefundenen Dateien anwenden:

find /home/peter -name "*.o" -o -name "*.log" -exec rm  {} \:

Der obige Befehl findet alle Dateien mit der Endung o und alle mit der Endung .log. Anschließend werden diese gelöscht. {} ist ein Platzhalter für die gefundenen Filenamen. Achtung: Der Befehl exec muss mit "\;" beendet werden. Dies zu vergessen ist ein beliebter Anfängerfehler!

© Copyright 2004 - 2008, Bodenseo, Linux-Kurse am Bodensee, Bernd Klein