Frage:
Wie kann man nach Datei-Inhalten suchen?
Antwort:
Zum Beispiel mit grep
:
grep Stichwort datei.txt
Ok, das wussten wir bereits alle. Aber ich will jetzt z.B. alle Dateien angezeigt bekommen in denen das Stichwort vorkommt. Wie geht das?
Hinhalts-Suche über mehrere Dateien
Die erste Idee ist meist "Ich brauche eine Schleife!":
(Kann auch als Einzeiler geschrieben werden wenn man in der 2.Zeile ein Semikolon anhängt.)
for i in *.txt; do
(cat $i | grep Stichwort) && echo "Found: " $i
done
Nicht schön und auch recht umständlich. Sollte man wohl eher als Script umsetzen.
Es geht aber auch anders.
Wie? Grep kann das:
grep -l -i Stichwort *.conf
Dank dem Parameter -l
(kleines L) werden nicht die gefundenen Zeilen innerhalb der Datei sondern die Dateinamen ausgegeben. Das -i
dient dem Ignorieren von Groß-/Kleinschreibung.
Ist schon recht schön. Aber in /etc/
würde es nur alle Dateien durchsuchen die direkt im /etc/
-Verzeichnis liegen. Was ist, wenn ich auch die Unterverzeichnisse durchsuchen möchte?
grep -l -i -r Stichwort *.conf
Genau: -r
steht für rekursives Durchsuchen.
Ok, damit decken wir bereits viele Fälle ab und finden unsere gewünschte Konfiguration fast auf Anhieb.
Erweiterung:
Ein Fall fällt mir aber noch ein, der noch nicht erschlagen wird:
Ich möchte nur die Dateien eines bestimmten Users durchsuchen!
Konkretes Beispiel aus der Praxis:
Ein Server hat mehrere Webs unter Joomla/Typo3/etc. Ich möchte wissen, welcher dieser CMS-Systeme auf eine bestimmte Datenbank zugreift. Ein o.g. grep
auf /var/www/
wäre zwar auch Zielführend, aber hat einer wahnsinnige Laufzeit die die gesamte Performance des Servers runter zieht und evtl. liefert dies auch eine ganze Menge an Schrott wenn der Datenbankname ein Begriff ist, der häufiger verwendet wird.
Aber ich weiß ja, das die Config-Dateien sowohl von Joomla als auch von Typo3 die Rechte des Webservers brauchen bzw. normalerweise vom Installer des CMS-Systems selber angelegt wurden. Daher gehe ich davon aus, ich suche eine PHP-Datei die dem User www-data
gehört.
find /var/www/ -type f -name *.php -user www-data -exec grep -l -i DatenbankName '{}' \;
Diese Zeile ist die von mir am häufigsten genutzte Version zum Auffinden von Dateien mit speziellem Inhalt. Natürlich wäre häufig eine der o.g. Wege schneller getippt. Aber ich bin ein Gewohnheitstier.