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

Ginu Jacob
quelle

Antworten:

11

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

Ginu Jacob
quelle
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.

G-Man sagt "Reinstate Monica"
quelle
5
find /path -iname "*.h" -exec grep -inH "string" "{}" \;
Ipor Sircer
quelle
1
-exec... +ist auch gut.
G-Man sagt "Reinstate Monica"
1
Mir ist gerade aufgefallen - Sie haben vergessen, "string"in Ihre Antwort aufzunehmen!
G-Man sagt 'Reinstate Monica'
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.

ANZEIGE
quelle
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
Dominique
quelle
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.

plnu
quelle