Rekursives grep schlägt für * .c-Dateien fehl

12

Ich habe versucht, ein Muster in allen .c-Dateien auf folgende Weise rekursiv zu durchsuchen

> grep -lr search-pattern *.c

Habe das aber als Ausgabe bekommen

> grep: *.c: No such file or directory

Wenn ich das benutze:

> grep -lr search-pattern *

Ich bekomme viel davon. c Dateien in den Verzeichnissen mit dem Muster.

Was ist falsch an dem früheren Ausdruck?

Jay
quelle

Antworten:

21

Ich schlage vor, die --includeOption zu verwenden grep:

grep -lr --include='*.c' search-pattern .
Enzotib
quelle
1
+1. Ich kannte die --include=GLOBOption nicht. In Kombination mit der rekursiven Option ist dies sehr leistungsfähig und erfordert nicht find. Nett!
Gertvdijk
Spät zur Party hier, aber ich bin verwirrt darüber, wofür das .am Ende des Befehls ist.
Nathan Jones
1
@NathanJones: grep benötigt einen oder mehrere Dateinamen oder Verzeichnisse, in denen gesucht werden soll. Der Punkt sagt: Suche im aktuellen Verzeichnis
Enzotib
3

Das *.cMuster wird von Ihrer Shell ausgewertet. Es gilt für das aktuelle Verzeichnis, genau wie Sie es verwenden würden ls *.c.

Ich denke, was Sie stattdessen wollen, ist, alle Dateien zu finden, die dem *.cMuster entsprechen (rekursiv) und darin grepnach Ihnen zu suchen. Hier ist eine Möglichkeit, dies zu tun:

find . -name "*.c" -print0 | xargs --null grep -l search-pattern

Es wird verwendet xargs, um die Suchergebnisse von anzuhängen find.


Alternativ können Sie die -execOption verwenden, um Folgendes zu finden: z.

find . -name "*.c" -exec grep -l search-pattern "{}" \;

Ich bin mir auch nicht sicher, ob Sie die -lOption wirklich wollen grep. Es wird beim ersten Spiel aufhören:

-l, --files-with-matches
      Suppress normal output; instead print the name of  each
      input  file  from which output would normally have been
      printed.  The scanning will stop on  the  first  match.
      (-l is specified by POSIX.)
gertvdijk
quelle
Die find/xargsSyntax bricht bei Dateinamen ab, die Leerzeichen enthalten. Die -LOption grep, beim ersten Abgleich jeder Datei zu stoppen und mit der nächsten Datei fortzufahren: Wenn man nur sehen möchte, ob das Muster mindestens einmal in jeder angegebenen Datei enthalten ist, ist es schneller.
Enzotib
@enzotib Danke, habe es mit -print0Option und behoben xargs --null.
Gertvdijk
-1

Ich weiß, dass dies ein ziemlich alter Thread ist, aber da ich die gleiche Frage hatte, möchte ich meine bevorzugte Art, dasselbe zu erreichen, in einer viel kürzeren Form teilen.

ls | grep "file.*.c"
Jebiel
quelle
2
Bei der Frage geht es um die Suche nach einem Muster, nicht um die Suche nach einer Datei.
Jay