Wie kann ich unter Linux alle Dateien finden, die einen bestimmten Text enthalten?

I'm versuchen, einen Weg zu finden, meine gesamte Linux-System für alle Dateien, die eine bestimmte Zeichenfolge von Text zu scannen. Nur um klarzustellen, ich bin für Text innerhalb der Datei suchen, nicht in den Dateinamen.

Als ich nachschaute, wie man das macht, stieß ich zweimal auf diese Lösung:

find / -type f -exec grep -H 'text-to-find-here' {} \;

Allerdings funktioniert sie nicht. Es scheint jede einzelne Datei im System anzuzeigen.

Ist das der richtige Weg? Wenn nicht, wie sollte ich vorgehen? Diese Fähigkeit, Textstrings in Dateien zu finden, wäre außerordentlich nützlich für einige Programmierprojekte, an denen ich arbeite.

Lösung

Gehen Sie wie folgt vor:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r oder -R ist rekursiv,
  • -n ist die Zeilennummer, und
  • -w steht für die Übereinstimmung mit dem ganzen Wort.
  • -l (kleingeschriebenes L) kann hinzugefügt werden, um nur den Dateinamen der passenden Dateien anzugeben.

Außerdem können die Flags --exclude, --include und --exclude-dir für eine effiziente Suche verwendet werden:

  • Damit werden nur die Dateien durchsucht, die die Erweiterungen .c oder .h haben:

    grep --include=\*.{c,h} -rnw '/pfad/zu/irgendwo/' -e "pattern"
  • Dies schließt die Suche in allen Dateien aus, die mit der Erweiterung .o enden:

    grep --exclude=*.o -rnw '/pfad/bis/irgendwo/' -e "muster"
  • Bei Verzeichnissen ist es möglich, ein oder mehrere bestimmte Verzeichnisse durch den Parameter "--exclude-dir" auszuschließen. So werden zum Beispiel die Verzeichnisse dir1/, dir2/ und alle Verzeichnisse, die auf *.dst/ passen, ausgeschlossen:

    grep --exclude-dir={dir1,dir2,*.dst} -rnw '/pfad/zu/irgendwo/' -e "muster"

Dies funktioniert bei mir sehr gut, um fast den gleichen Zweck wie bei Ihnen zu erreichen.

Für weitere Optionen siehe man grep.

Kommentare (36)

Sie können grep -ilR verwenden:

grep -Ril "text-to-find-here" /
  • i steht für ignore case (in Ihrem Fall optional).
  • R" steht für rekursiv.
  • l" steht für "zeige den Dateinamen, nicht das Ergebnis selbst".
  • / steht für das Starten im Stammverzeichnis Ihres Rechners.
Kommentare (29)

Sie können ack verwenden. Es ist wie grep für Quellcode. Sie können damit Ihr gesamtes Dateisystem durchsuchen.

Tun Sie es einfach:

ack 'text-to-find-here'

In Ihrem Stammverzeichnis.

Sie können auch reguläre Ausdrücke verwenden, den Dateityp angeben, usw.


UPDATE

Ich habe gerade The Silver Searcher entdeckt, der wie ack ist, aber 3-5x schneller als dieser und sogar Muster aus einer .gitignore-Datei ignoriert.

Kommentare (3)