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

