Shells
Home
Erste Schritte mit der Bourne-Shell
Dateien zeilenweise zusammenfügen
Head or Tail
Schleifen und Zählen
Shell-Variablen
Pipes
Sortieren von Daten
Wer sucht der findet!
Praktische Shell-Skripte
Rechtschreibung
Schleifen und elegant Zählen
Texte formatieren mit fmt und fold
Umlenkung der Ein- und der Ausgaben
Klammer-Erweiterung
Verknüpfen von Textdateien mittels Schlüsselfeldern
Mit freundlicher Unterstützung von:
Linux-Kurse und Seminare
Veranstalter des
Linux-Tag am Bodensee 2007 und 2008
Kontakt
Haftung
Impressum
Problem Hilfe Startseite
|
Wer
sucht der findet!
Obwohl der find-Befehl wohl einer der mächtigsten und
nützlichsten Befehle in Linux (und
Unix) ist, wird er leider
allzu häufig von Anfänger wegen seiner vermeintlichen
Komplexität gemieden. Nach den Erklärungen und Beispielen
dieser Seite wird hoffentlich jedem Anfänger klar sein, dass das
Arbeiten mit find keine Hexenkunst ist.
Die allgemeine Syntax lautet:
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
Am besten schauen wir uns die Arbeitsweise von 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 Falle 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!
|