Hier die Lösung für das Problem: Wie finde ich eine bestimmte Datei unter Linux oder eine Textstelle, wenn ich nicht weiß, in welcher Datei ich suchen muss. Gerade Webmaster kennen das Problem: Wenn man ein größeres Web-Projekt bearbeitet, sucht man manchmal unnötig lange nach gewissen Textstellen, Bildern oder Dateinamen, die in einem Template oder Theme versteckt sind. Nur in welcher Datei man suchen muss, weiß man leider selten.
Hat man per SSH Zugriff zu dem Webserver, ist das Suchen leicht: Man kann den Server selber suchen lassen. Diese Beispiele durchsuchen das Dateisystem nach verschiedenen Suchmustern (zum Beispiel Dateiname, Alter der Datei oder Größe) oder suchen einen enthaltenen Textstring auf dem Server in dem aktuellen Ordner und allen Unterordnern: So kann man sich schnell die betreffenden Dateien auflisten lassen und diese später bearbeiten.
Download-Tipp:
Auch ohne Shell-Zugriff auf den Server kann man diese Befehle nutzen, indem man sie in eine PHP Datei kopiert. Ein fertiges Skript haben wir hier als Beispiel: In den Haupt-Ordner der Webseite kopiert, durchsucht das Skript mit dem grep Befehl nach allen Vorkommnissen des Suchtextes (sowohl groß- als auch kleingeschrieben). Keine Angst: Das Skript verschickt keine Daten und kann natürlich vorher problemlos angesehen und geprüft werden!
» Zum Download
Datei nach Dateinamen, Größe oder Alter suchen
Die erste Suche sucht bestimmte Dateien anhand ihres Namens, ihrer Größe oder anhand des Alters. So lassen sich zum Beispiel sehr schnell neue Dateien finden, die erst in der letzten Woche erstellt wurden – oder Dateien, von denen man noch einen Teil des Namens kennt. Der Befehl “find” listet er rekursiv (also auch mit Unterordnern) die Dateien auf, die die gesuchte Textstelle oder Teile des Dateinamens enthalten:
find . -type f -name "logo.*"
Dies ist praktisch, wenn man sich noch an den Dateinamen oder Teile davon erinnern kann: Mit dem oben genannten Befehl sucht Linux im aktuellen Ordner (und allen Unterordnern) nach Dateien, deren Dateiname mit “logo.” beginnt. Verwendet man statt “-name” den Zusatz “-iname”, ignoriert der Befehl die Groß- und Kleinschreibung im Dateinamen und würde auch Dateien finden, deren Name mit “LOGO.” oder “Logo.” beginnt.
Eine weitere Möglichkeit ist die Suche nach neuen Dateien: So lassen sich mit “find” Dateien auflisten, die erst einen Tag oder eine Woche alt sind:
Dateien, die in den letzten 24 Stunden erstellt wurden:
find . -mtime 0
Dateien, die genau 5 Tage alt sind:
find . -mtime 5
Dateien, die älter als 5 Tage sind:
find . -mtime +5
Dateien, die neuer als 5 Tage sind:
find . -mtime -5
Der “find” Befehl kann aber auch nach der Größe einer Datei suchen, um zum Beispiel alle großen Dateien eines Verzeichnissen (oder in den Unter-Ordnern) zu zeigen. Hier kann man die Dateigröße mit “k” für Kilobyte, “M” für Megabyte und “G” für Gigabyte angeben – außerdem mit einem Plus oder Minus davor:
find . -size +100M
Dieser Befehl sucht jetzt alle Dateien im aktuellen Ordner und allen Unterordnern, die größer als 140 Megabyte sind. Alternativ kann man aber auch nach Dateien suchen, die kleiner sind:
find . -size -10k
So werden nur Dateien aufgelistet, die kleiner sind als 10 Kilobyte. Die Befehle lassen sich mit “-name” und “-mtime” aber auch nach belieben kombinieren: So kann man mit diesem Befehl zum Beispiel nur nach Dateien unter 15 Kilobyte suchen, die die Dateiendung “.php” haben und nicht älter sind als fünf Tage:
find . -size -15k -name "*.php" -mtime -5
Dateien nach ihrem Inhalt finden
Find kann aber nicht nur nach Dateinamen suchen, sondern auch im Inhalt der Datei suchen: Das ist praktisch für Text- oder HTML-Dateien, bei denen der Suchtext direkt gefunden werden kann. “Find” ist hier allerdings deutlich langsamer als die anschließend folgende Variante mit “grep”:
find . -type f -exec fgrep -l 'Suchtext' {} \;
Dies sucht nach Dateien, die den Begriff “Suchtext” enthalten – allerdings als Text-Inhalt der Datei und nicht als Dateiname. Der Befehl lässt sich zusätzlich noch mit den vorher genannten Beispielen erweitern, um nur bestimmte Datei-Typen zu aufzulisten oder nur die neuesten Dateien zu zeigen, die den Begriff “Suchtext” enthalten:
find . -type f -name "*.php" -exec fgrep -l 'Suchtext' {} \;
Mit der zusäztlichen Suche nach “*.php” werden in den Suchergebnissen nur die Dateien mit der Endung “.php” angezeigt. Kommt der Suchbegriff noch in anderen Dateien vor, werden diese nicht angezeigt.
find . -type f -mtime 0 -exec fgrep -l 'Suchtext' {} \;
Die Kombination mit “mtime” sucht jetzt nur noch nach Dateien, die einerseits den Suchbegriff enthalten, andererseits aber auch vom Datum der Erstellung oder letzten Änderung passen: Das oben genannte Beispiel zeigt nur Dateien an, die in den letzten 24 Stunden verändert oder erstellt wurden und den Begriff “Suchtext” innerhalb der Datei enthalten.
Dateisuche mit grep
Der nächste Befehl arbeitet deutlich schneller und zeigt ebenfalls auch die Fundstellen un Unterordnern an:
grep -rnwl './' -e "Suchtext"
So sucht man nach der exakten Schreibweise, hier wird auch Groß- und Kleinschreibung beachtet. Ist das nicht wichtig, oder ist man nicht sicher, muss man noch den Parameter “i” hinzufügen: So sucht man sowohl nach Logo.gif als auch nach logo.gif.
grep -rnwli './' -e "Suchtext"
Lässt man in dem Befehl das “l” weg, erhält man auch die genaue Textstelle, dafür wird es aber etwas unübersichtlich: Zusammen zu der Datei und auch der Zeilennummer, in der sich der gesuchte Text in der Datei befindet, wird ein Ausschnitt aus der Datei angezeigt. Das ist zwar praktisch, um die Datei direkt zu prüfen, kann bei mehreren Fundstellen aber recht verwirrend werden:
grep -rnw './' -e "Suchtext"
Beispiel: Aufruf des Bildes “logo.png” auf dem Server suchen
Wenn man ein neues Logo auf einer Webseite einbauen möchte, kann man das alte Bild oft einfach überschreiben. Hat das neue Bild aber eine andere Größe, muss im HTML Code auf der Webseite auch der <img&rt; Tag angepasst werden, damit die neue Größe auch übernommen wird. Wenn man jetzt nicht mehr weiß, in welcher Datei das Logo definiert wurde, kann man es dann zum Beispiel mit diesem Code suchen:
grep -rnwl './' -e "logo.png"
Um die Datei “logo.png” selbst zu finden, hilft wiederum der “find” Befehl mit Angabe des Dateinamens:
find . -type f -name "logo.png"