28.11
2006

Suchen mit find

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
erschliessen.

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 heisst 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. Anschliessend 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!

powered by performancing firefox

Drucken PDF

Switch to our mobile site