grep alle .java-Dateien in einem Verzeichnis für eine bestimmte Zeichenfolge

12

Wie suche ich in allen .java-Dateien nach einer einfachen Zeichenfolge (keine reguläre Zeichenfolge) im aktuellen Verzeichnis und in allen Unterverzeichnissen unter Mac OS X? Ich möchte nur eine Liste der übereinstimmenden Datei- und Verzeichnisnamen drucken.

John Topley
quelle
Danke, dass du das gefragt hast, damit ich nicht muss. Jetzt muss ich nur noch herausfinden, wie ich ".git" ausschließen kann und bin für eine Weile fertig.
Dan Rosenstark
Ich denke, die Antwort von js ist prägnanter, saugt immer noch, dass Sie tippen müssen - einschließlich, aber dennoch. Könnte wahrscheinlich nur einen Alias ​​schreiben, um das zu verbergen
Craig Tataryn

Antworten:

19

Und das immer beliebt

find . -name '*.java' | xargs grep -l 'string'

EDIT (von Frank Szczerba):

Wenn Sie mit Dateinamen oder Verzeichnissen arbeiten, in denen Leerzeichen enthalten sind, ist dies am sichersten:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

Es gibt immer mehr als einen Weg, dies zu tun.

David Mackintosh
quelle
11

Die traditionelle UNIX-Antwort wäre die, die für diese Frage akzeptiert wurde:

find . -name '*.java' | xargs grep -l 'string'

Dies wird wahrscheinlich für Java-Dateien funktionieren, aber Leerzeichen in Dateinamen sind auf Macs weitaus häufiger als in der traditionellen UNIX-Welt. Wenn Dateinamen mit Leerzeichen durch die Pipeline oben geleitet werden, interpretiert xargs die einzelnen Wörter als unterschiedliche Namen.

Was Sie wirklich wollen, ist, die Namen nicht zu trennen, um die Grenzen eindeutig zu machen:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

Die Alternative besteht darin, find run grep für Sie ausführen zu lassen, wie Mark vorschlägt, obwohl dieser Ansatz langsamer ist, wenn Sie eine große Anzahl von Dateien durchsuchen (da grep nicht nur einmal mit der gesamten Dateiliste, sondern nur einmal pro Datei aufgerufen wird).

Frank Szczerba
quelle
Sie können in xargs auch die Option "--replace" verwenden, um Dateinamen mit Leerzeichen zu behandeln: ... | xargs --replace grep 'string' '{}' ({} würde durch den Dateinamen ersetzt)
arathorn
1
Moderne Versionen von find (einschließlich der unter OS X installierten) unterstützen "-exec <Befehl> {} +", wobei das Pluszeichen am Ende (anstelle von \;) find anweist, {} durch "so viele Pfadnamen wie möglich zu ersetzen ... Dies ähnelt dem von xargs (1) "(aus der Manpage).
Doug Harris
7

Verwenden Sie das grep, das besser ist als grep, ack :

ack -l --java  "string" 
bortzmeyer
quelle
3
ack ist standardmäßig nicht auf Mac OS X installiert.
John Topley
Ich weiß nicht, was "standardmäßig" bedeutet. Auf vielen Betriebssystemen wählen Sie, was Sie installieren, so dass es schwierig ist, Programme zu finden, die immer vorhanden sind. Zu einer Zeit war immer ein C-Compiler dabei und Perl war ungewöhnlich ...
bortzmeyer
1
Dies bedeutet, dass es Teil der Standardinstallation des Betriebssystems ist. Ich habe die Entwicklertools auf meinem Mac installiert und sie installieren ack nicht. Sie müssen es selbst installieren. Wenn Sie es haben, dann ist es eine schöne Syntax.
John Topley
Bei ack handelt es sich um ein einzelnes Perl-Programm ohne Modulabhängigkeiten. Wenn Sie Programme in Ihrem ~ / bin-Verzeichnis "installieren" können, können Sie ack genauso einfach "installieren".
Andy Lester
4

Dabei wird ein regulärer Ausdruck verwendet, wenn Sie möchten. Halten Sie sich einfach von den Metazeichen fern oder entziehen Sie sich diesen, und Sie können nach Zeichenfolgen suchen.

find . -iname "*.java" -exec egrep -il "search string" {} \;

Mark Thalman
quelle
3
grep -rl --include="*.java" simplestring *
js.
quelle
1
Dies scheint hier die beste Antwort zu sein - wenn grep alles macht, warum find & xargs verwenden?
Peter Gibson
Zu
Ihrer Information
Craig hat recht, ich habe meine Antwort korrigiert.
js.
1

Da es sich um eine OSX-Frage handelt, finden Sie hier eine spezifischere Antwort für OSX.

Überspringen findund verwendenSpotlight über die Befehlszeile verwenden. Viel mächtiger!

COMMAND LINE SPOTLIGHT - FIND TRIFFT GREP

Die meisten Leute wissen nicht, dass Sie Spotlight-Suchen über die Befehlszeile ausführen können. Warum sollten Sie sich an all die arkanen Such- und Grep-Optionen erinnern und was nicht, wenn Sie Spotlight die Arbeit für Sie erledigen lassen können? Die Befehlszeilenschnittstelle zu Spotlight heißt mdfind. Es hat die gleiche Leistung wie die GUI Spotlight-Suche und mehr, da es über die Befehlszeile skriptfähig ist!


quelle
0

Probieren Sie es aus:

grep -rl "string" */*java
dwj
quelle
1
Dies gibt "grep: * / * java: Keine solche Datei oder Verzeichnis" auf Mac OS X.
John Topley
Das Problem hierbei ist, dass nur eine Ebene tiefe * .java-Dateien gefunden werden. Siehe Mark Thälmans Antwort für IMHO, wie man das richtig macht.
Ludwig Weinzierl,
Entschuldigung, nicht auf meinem Mac. Hat die Mac-Version von grep nicht das Flag -r (rekursiv)?
Dienstag,
Das stimmt, aber das war die Ausgabe, die ich bekam, als ich nach einer Zeichenfolge suchte, von der ich weiß, dass sie in den Dateien enthalten ist.
John Topley
0

Sie können auch ein GUI-Programm wie TextWrangler verwenden , um eine intuitivere Suche durchzuführen, bei der die Optionen in der Benutzeroberfläche angezeigt werden.

Mark Thalman
quelle
0
grep "(your string)" -rl $(find ./ -name "*.java")

Wenn Sie die Groß- / Kleinschreibung ignorieren möchten, ersetzen Sie -rl durch -irl. (Ihre Zeichenfolge) kann auch ein regulärer Ausdruck sein, wenn Sie jemals die Notwendigkeit sehen.

lachender_mann
quelle