Wenn man sich im Terminal durch Konfigurationsdateien hangelt, kann es durchaus vorkommen das man eine bestimmte Zeichenkette in den Dateien eines Ordners und dessen Unterordnern sucht. Hierfür bietet sich eine Kombination von „find“ und „grep“ an:
find . -type f -exec grep -l 'suchbegriff' {} \;
Das „find“ Kommando ermittelt dabei alle Dateien und übergibt sie dann an „grep“. Als Ausgabe erhält man anschließend eine Liste der Dateien in welchen der gesuchte Begriff enthalten ist.
Kleine Frage am Rande: warum nicht gleich grep -r verwenden?
Meines Wissen erlauben nicht alle grep Versionen diese Variante.
Jo, soweit ich weiß, kann das nur GNU grep.
Wobei es aber auch oft Alternativen gibt, die einen nicht zu solchen Konstrukten zwingen. Unter Solaris gibt es iirc ggrep. Damit ist dann auch die rekursive Suche möglich.
Dazu habe ich mal ein Skript „grepfind“ geschrieben, das auch nach Jahren noch zu meinen meistgenutzten Skripten gehört.
Vorteile: keine Fehlermeldungen (2>/dev/null), Suchstring und suchpfad werden zwischengespeichert und erleichtern die erneute suche, gefundene strings werden in textdatei gespeichert usw. usw.
Hier die Info (mit Screenshot): http://netz10.de/2009/07/24/findgrep/
Und direkt zum Skript: http://netz10.de/downloads/scripts/findgrep/findgrep_latest
Sobald man Dateimuster angibt wird es mit dem rekursiven Suchen schwierig mit grep -r (oder mache ich was falsch?), Es wird dann
grep -r List *.scala
nur in Unterverzeichnissen gesucht, die auch dem Dateimuster entsprechen – ein eher seltener Fall.
Das ist dagegen mit find kein Problem:
find . -name "*.scala" -exec grep -q List {} ";" -print
Zwei tips, um das ganze etwas zu optimieren:
1. xargs statt -exec
-exec nutzt 1 Ergebnis von find pro Ausführung. Mit xargs werden direkt mehrere Ergebnisse genutzt, was deutliche Geschwindigkeitsvorteile bringt, wenn man sich durch einen großen Haufen Quellcode angelt. -print0 und -0 ermöglichen whitespaces in Dateien und Verzeichnissen.
find . -type f -print0 | xargs -0 "Suchbegriff"
2. ack statt grep.
Ack ist ein grep welches auf das Durchsuchen grosser Coderepositories optimiert ist (was Geschwindigkeit wie auch Anzeige angeht). Unter Debians kriegt man ack über das Paket ack-grep.
1. `+` statt `;`
`find . -type f -exec grep -l ’suchbegriff‘ {} \+` macht genau das, was du mit xargs machen willst ;)
2. Ag statt Ack statt grep
https://github.com/ggreer/the_silver_searcher
*sigh* Wie formatiert man denn sein Kommentar hier richtig?
Ich habe noch kein Linux System gesehen auf dem „grep – R“ nicht funktioniert. Das Fehlen der Option nervt mich nur auf Solaris Systemen.
Es reicht also beispielsweise:
grep – R Suchbegriff /
Find macht nur Sinn, wenn man die Suche auf bestimmte Dateinamen einschränken möchte (z. B. nur in Daten suchen, die mit .conf enden)