Grep in Dateien mit einer bestimmten Erweiterung unter einem Verzeichnis


11

Gibt es einen Befehl, mit dem ein Schlüsselwort in Dateien unter einem Verzeichnis mit einer bestimmten Erweiterung gesucht werden kann?

Die Zeichenfolge grep -irn "string" ./pathbietet eine rekursive Suche nach allen Dateien im Verzeichnis ./path. Meine spezielle Anforderung besteht darin, in allen Dateien unter ./pathmit einer Erweiterung wie z*.h

Antworten:


11

Nach einigen Versuchen halte ich grep -irn 'string' --include '*.h'es für praktischer


1
Wenn Sie das tun, stellen Sie sicher, dass Sie die "*.h"Anführungszeichen setzen.
G-Man sagt 'Reinstate Monica'

Es funktioniert mit und ohne Anführungszeichen
Ginu Jacob

3
Jetzt tut es. Versuchen Sie, eine Datei zu erstellen, die foobar.him aktuellen Verzeichnis aufgerufen wird , und versuchen Sie es erneut.
G-Man sagt "Reinstate Monica"

10

S et (einschalten) der sh ell opt ion globstarmit dem Kommando

    shopt -s globstar

Dies führt dazu, dass **als Dateinamenkomponente hier und unten alles bedeutet. Bedeutet path/**also alles im pathVerzeichnis und seinen Unterverzeichnissen . (Sie müssen hier nicht tippen ./.) Dann können Sie verwenden

grep -in "string" path/**/*.h

um alle .hDateien in und unter zu durchsuchen path.


Sie können u nsoll Optionen mit shopt -u.



3

Wenn Sie etwas auf Ihrem Computer installieren können, empfehle ich die Verwendung von ack .

Sie können genau das tun, was Sie brauchen, und vieles mehr. Für Ihren Anwendungsfall können Sie Folgendes tun:

# Depending of your system, you have to use one or the other
ack --hh -i string path
ack-grep --hh -i string path
  • --hh filtert nach h Dateien
  • -i ignoriert den Fall

Führen Sie den Befehl aus, um herauszufinden, welche Dateifilter nativ unterstützt werden ack --help=type.


Es gibt auch ag , einen ehemaligen Klon von ack. Früher, weil ihre Funktionssätze seitdem etwas auseinander gegangen sind.
8bittree

Ich wusste nicht ag. Danke für das Teilen.
AD

3

Was ist mit diesem?

find -L ./path -name "*.h" -exec grep -in "string" {} \;

Erläuterung:

  • -L: Folgen Sie den Symlinks
  • -name: Mit dem Sternchen können Sie Erweiterungen beschreiben
  • -in: Wie Ihr Vorschlag, aber das 'r' wird durch den findBefehl ersetzt
  • {}: Dies steht für das Ergebnis des findBefehls
  • \; : Sie sind im Fall kombinieren findmit -exec, das ist die End-of-Befehlsspezifizierer

1
Wie funktioniert das "*.h"? Ich hätte gedacht, es müsste sein'*.h'
Joe

Ich arbeite immer mit doppelten Anführungszeichen, ich glaube nicht, dass es einen Unterschied macht.
Dominique

0

Wenn Sie gnu grep verwenden, hat es eine Flagge, die genau das tut, was Sie wollen:

grep -irn --include=\*.h "string" path

obwohl ich nicht denke, dass es in anderen greps verfügbar ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.