seeseekey.net - Invictus Deus Ex Machina

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.

10 Kommentare

  1. Kleine Frage am Rande: warum nicht gleich grep -r verwenden?

    Antworten

  2. 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

    Antworten

  3. 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.

    Antworten

  4. 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)

    Antworten

Schreibe einen Kommentar

You have to agree to the comment policy.