Beschreibung:
Fast jeder kennt und nutzt locate. Nicht ganz so einfach, allerdings nicht unwesentlich
leistungsfähiger ist der Befehl find.
Nutzt man den Befehl ohne einer Angabe von Parametern dann gibt find alle Dateien aus, die sich unterhalb des Verzeichnisses befinden, dies ist zwar nett, aber nicht wirklich sinnvoll.
Sucht man z. B. eine bestimmte Datei, von der genaue Dateiname noch bekannt ist, ist das folgende Beispiel einen Versuch wert:
find . -name tux.jpg
Bei diesen Beispiel wird die Datei tux.jpg gesucht. Der Punkt bewirkt das alle Verzeichnisse ab den aktuellen durchsucht werden. Man kann die Suche natürlich ein wenig steuern, indem man das vermutete Verzeichnis direkt angibt:
find /home/dirk/ -name tux.jpg
oder man entscheidet sich für die ungeschnittene Version:
find / -name tux.jpg
Wobei durch den / angegeben wird, das find im Stammverzeichnis anfängt.
Wie auch bei locate muß man sich nicht wundern, das man lauter Fehlermeldungen erhält, wenn man nicht als root angemeldet ist. Da man nicht auf jedes Verzeichnis zugreifen darf.
WICHTIG!
Bei den oben angegebenen Beispielen ist die Suche Case-Sensitive, was bedeutet, das find Groß- und Kleinschreibung unterscheidet. Möchte man dies unterbinden, kann man das mit dem
Argument -iname verhindern.
Also beispielsweise:
find / -iname tux.jpg
TIPP:
Wildcards sind unter Linux so eine Sache. Wenn man Wildcards nutzen möchte, und sicherstellen, das find die richting intepretiert, ist es ratsam, diese in Anführungszeichen zu setzen.
Andererseits kann es nämlich schnell zu einer Fehlermeldung führen.
find / -name inde*
find: paths must precede expression
Usage: find [path...] [expression]
Das liegt daran, das die Shell in diesem Beispiel 2 Dateien gefunden hat, und beide in find einsetzt. Das würde in diesen Beispiel nämlich folgendermaßen aussehen:
find / -name index.html index.php
was natürlich nicht funktionieren kann.
Den Fehler umgeht man, indem man das * maskiert:
find / -name inde\*
OK! Soweit so gut, aber was kann find, was locate nicht kann?
Mit find ist es auch möglich nach anderen Suchkriterien zu suchen als den Dateinamen.
Man kann zum Beispiel mit folgenden Befehl Dateien suchen, sie innerhalb der letzten
24 Stunden geändert wurden:
find / -mtime 0
Mit -mtime 2 würde er die Dateien anzeigen, die in den letzten 48 Stunden geändert wurden.
Genauer gehts mit:
find / -mmin 20
Letzteres Beispiel gibt zum Beispiel an, welche Dateien in den letzten 20 Minuten geändert wurde.
Möchte man zum Beispiel ein wenig aufräumen und alle Dateien suchen, die größer wie 1 MB (1000k) sind, kann man mit den folgenden Argument tun:
find / -size +1000k
Möchte man nur Verzeichnisse oder Dateien anzeigen lassen, kann man auch das ausfiltern.
Mit -type kann man die Dateitypen bestimmen.
Für Verzeichnisse:
find / -type d
Für Dateien:
find / -type f
Für Symbolische Links:
find / -type l
Spätestens jetzt sollte eigentlich jeder den Nutzen des Befehls erkannt haben, allerdings kann find noch ein wenig mehr.
Das man verlorengegangene Dateien findet ist ja schön und gut. Jetzt möchten wir die gefundenen Dateien auch noch anderweitig weiterverarbeiten.
find /home/ich/ -name "*.txt" -exec less "{}" ";"
Dieser Befehl sucht alle Dateien im Verzeichnis /home/ich mit der Dateiendung .txt und gibt diese an less weiter. Diese kann man sich dann mit der Leertaste durchblättern, mit q verlässt man die aktuelle Datei und sieht den Inhalt der nächsten. Find setzt also die Dateinamen der gefundenen Dateien in die geschweiften Klammern ({}) und das Semikolon (;) markiert das Ende des Befehls. Die Anführungszeichen sind wieder wichtig, da die Klammern und das Semikolon in der Shell eine Sonderfunktion besitzen.
Wem das ganze zu heikel ist (vor allem, wenn die Dateien verändert werden, und manche Veränderungen ziemlich entgültig sind) für dem ist die Option -ok interessant. Diese wird anstelle von
-exec verwendet.
In diesen Beispiel werden zum Beispiel alle Sicherheitskopien gelöscht, die „Joe“ (ein ziemlich netter Komandozeileneditor) anlegt, wenn zum Beispiel eine .php Datei mit STRG + X gespeichert wurde.
find /home/webverzeichnis/ -name "*.php~" -ok rm "{}" ";"
oder die Softi-Variante:
find /home/webverzeichnis/ -name "*.php~" -ok mv "{}" /home/webverzeichnis/sicherheitskopie/ ";"
Bei letzteren Beispiel wird man bei jeder Datei gefragt, ob diese in /home/webverzeichnis/sicherheitskopie/ kopiert werden darf, danach kann man das Verzeichnis manuell löschen (/home/webverzeichnis/sicherheitskopie/ natürlich) wenn man sich also wirklich wirklich wirklich sicher ist.
Als letzten noch meine absolute Lieblingsfunktion:
find / -type f -exec grep -H "Suchbegriff" {} \;
Hiermit sucht man alle Dateien (-type f) und durchsucht Sie nach dem Wort Suchbegriff die Option -H bei grep gibt an, das alle Übereinstimmungen ausgegeben werden auch z. B. Suchbegriffe.
In diesen Befehl sind die Anführungszeichen bei den Klammern und Semikolon wegzulassen, da sonst nur Unsinn ausgegeben wird.
Äußerst sinnvoll für schusselige Roots wie ich, die Zwar wissen, wie die Option heißt, die sie ändern wollen, jedoch nicht mehr den Dateinamen der Datei, die diese Einstellung enthält. :D
ich glaube die Erklärung zu -mtime & -mmin stimmt nicht ganz.
-mtime 0 = findet Dateien, die innerhalb der letzten 24 Std. geändert oder erzeugt wurden
-mtime 1 = findet Dateien, die innerhalb der letzten 24-48 Std. geändert oder erzeugt wurden (keine Dateien der letzten 24 Std.)
…..
-mmin 1 – findet Datein die exakt vor 1 Min geändert worden sind
-mmin 4 – findet Dateien, die exakt vor 4 Min geändert worden sind (also keine Dateien die vor 0-3 Minuten geändert worden sind)
Danke für das Feedback! Ich werde das mal testen und dann unter Umständen (und danach siehts ja aus ;) ) berichtigen.