Suchen Sie eine Zeichenfolge nur in einer bestimmten Datei in Unterverzeichnissen

10

Angenommen, ich muss die Funktion GetTypes()in allen C # -Quelldateien ( .cs) der Verzeichnisse / Unterverzeichnisse finden.

Ich habe verwendet grep -rn GetTypes *.cs, aber ich habe einen Fehler mit grep: *.cs: No such file or directory. Ich musste verwenden grep -rn GetTypes *, aber in diesem Fall zeigt es nicht *.csnur alle Dateien .

Welchen Befehl muss ich verwenden, um die Zeichenfolge nur in .csDateien zu finden?

prosseek
quelle

Antworten:

12

Wenn Ihre Shell Bash ≥4 ist, geben Sie shopt -s globstarIhre ~/.bashrc. Wenn deine Shell zsh ist, bist du gut. Dann kannst du rennen

grep -n GetTypes **/*.cs

**/*.csbedeutet, dass alle Dateien, die *.csim aktuellen Verzeichnis oder in seinen Unterverzeichnissen übereinstimmen , rekursiv übereinstimmen .

Wenn Sie keine Shell **ausführen, die unterstützt --include, aber Ihr grep unterstützt , können Sie ein rekursives grep ausführen und festlegen grep, dass nur Dateien berücksichtigt werden sollen, die bestimmten Mustern entsprechen. Beachten Sie die Anführungszeichen um das Dateinamenmuster: Es wird von grep und nicht von der Shell interpretiert.

grep -rn --include='*.cs' GetTypes .

grep -rVerwenden Sie nur tragbare Tools (einige Systeme haben diese überhaupt nicht), um sie findfür den Verzeichnisüberquerungsteil und grepfür den Textsuchteil zu verwenden.

find . -name '*.cs' -exec grep -n GetTypes {} +
Gilles 'SO - hör auf böse zu sein'
quelle
globstarVerwenden Sie Folgendes, um die Option für eine aktuelle Bash 4+ -Shell vorübergehend festzulegen shopt -s globstar.
Tjanez
8

Sie sollten sich den billiant kleinen grep / find Ersatz ansehen, der als bekannt ist ack. Es ist speziell für die Suche in Verzeichnissen von Quellcodedateien eingerichtet.

Ihr Befehl würde folgendermaßen aussehen:

ack --csharp GetTypes
Caleb
quelle
4

Wenn Sie GNU verwenden grep, können Sie angeben, welche Dateien in eine rekursive Verzeichnisdurchquerung aufgenommen werden sollen:

grep --include '*.cs' -rn GetTypes .

(wobei der letzte Punkt das aktuelle Arbeitsverzeichnis als Stamm der Durchquerung bezeichnet)

maxschlepzig
quelle
4

Ich verwende eine Kombination aus find und grep:

find . -name "*.cs" | xargs grep "GetTypes" -bn --color=auto

Zum Beispiel findkönnen Sie .durch ein Verzeichnis ersetzen und entfernen, -namewenn Sie in jeder Datei suchen möchten.

Für grep, -bndie Position und die Zeilennummer drucken und --colorIhre Augen helfen wird durch Hervorhebung , was Sie suchen.

Kevin
quelle