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

13960
John Topley

Wie würde ich alle .java-Dateien nach einer einfachen Zeichenfolge (nicht einem regulären Ausdruck) im aktuellen Verzeichnis und allen Unterverzeichnissen unter Mac OS X durchsuchen? Ich möchte nur eine Liste der übereinstimmenden Datei- und Verzeichnisnamen drucken.

12
Danke, dass du das fragst, also muss ich nicht. Jetzt muss ich nur noch herausfinden, wie ".git" ausgeschlossen werden kann, und ich bin ein bisschen fertig. Dan Rosenstark vor 13 Jahren 0
Ich denke, die Antwort von js ist prägnanter, immer noch scheiße, die man eingeben muss - einschließlich, aber immer noch. Könnte wahrscheinlich nur einen Alias ​​schreiben, um das zu verbergen Craig Tataryn vor 12 Jahren 0

9 Antworten auf die Frage

18
David Mackintosh

Und das immer beliebt

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

EDIT (von Frank Szczerba):

Wenn Sie mit Dateinamen oder Verzeichnissen arbeiten, die Leerzeichen enthalten, ist dies der sicherste Weg, dies zu tun:

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

Es gibt immer mehrere Möglichkeiten, dies zu tun.

`mdfind` [ist eine OSXy-Methode, um dies zu tun] (http://www.vertigrated.com/blog/2010/03/command-line-spotlight-find-meets-grep/)! Jarrod Roberson vor 12 Jahren 0
11
Frank Szczerba

Die traditionelle UNIX-Antwort wäre diejenige, 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 Mac viel häufiger als in der traditionellen UNIX-Welt. Wenn Dateinamen mit Leerzeichen durch die Pipeline geleitet werden, interpretiert xargs die einzelnen Wörter als verschiedene Namen.

Was Sie wirklich wollen, ist die Trennung der Namen, um die Grenzen eindeutig zu machen:

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

Die Alternative ist, 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 einmal pro Datei und nicht einmal mit der gesamten Liste der Dateien aufgerufen wird).

Sie können auch die Option "--replace" in xargs verwenden, um Dateinamen mit Leerzeichen zu behandeln: ... | xargs --replace grep 'string' '{}' ({} würde durch den Dateinamen ersetzt) arathorn vor 14 Jahren 0
Moderne Versionen von find (einschließlich der unter OS X installierten) unterstützen "-exec" {} + "wobei das Pluszeichen am Ende (anstelle von \;) sagt, find {} durch" so viele Pfadnamen wie möglich ... zu ersetzen. Dies ist dem von xargs (1) "ähnlich (von der Manpage) ). Doug Harris vor 14 Jahren 1
6
bortzmeyer

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

ack -l --java "string" 
ack ist unter Mac OS X nicht standardmäßig installiert. John Topley vor 14 Jahren 3
Ich weiß nicht, was "standardmäßig" bedeutet. Bei vielen Betriebssystemen wählen Sie das, 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 vor 14 Jahren 0
Dies bedeutet, dass es Teil der Standard-Betriebssysteminstallation ist. Ich habe die Entwicklertools auf meinem Mac installiert, und ack wird nicht installiert. Sie müssen es selbst installieren. Wenn Sie es haben, dann ist es eine schöne Syntax. John Topley vor 14 Jahren 1
Im Falle von 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 genauso einfach "installieren". Andy Lester vor 13 Jahren 0
4
Mark Thalman

Wenn Sie möchten, verwenden Sie einen regulären Ausdruck. Halten Sie sich einfach von den Metazeichen fern oder lassen Sie sie durch, und Sie können nach Zeichenketten suchen.

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

3
js.
grep -rl --include="*.java" simplestring * 
Dies scheint die beste Antwort zu sein - wenn grep das alles macht, warum also find & xargs verwenden? Peter Gibson vor 13 Jahren 1
Zu Ihrer Information, in Anbetracht dessen, was in der Frage gestellt wurde, sollte es in diesem Befehl ein kleines "l" und kein großes "L" sein Craig Tataryn vor 12 Jahren 0
Craig hat recht, ich habe meine Antwort korrigiert. js. vor 12 Jahren 0
1
Jarrod Roberson

Da dies eine OSX-Frage ist, gibt es hier eine spezifischere OSX-Antwort.

Überspringen findund Spotlightvon der Befehlszeile aus verwenden. Viel mächtiger!

BEFEHLSLINIE SPOTLIGHT - FIND TRIFFT GREP

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

0
dwj

Probieren Sie es aus:

grep -rl "string" */*java 
Unter Mac OS X wird "grep: * / * java: Keine solche Datei oder Verzeichnis" angezeigt. John Topley vor 14 Jahren 1
Das Problem hierbei ist, dass * .java-Dateien nur eine Ebene tief gefunden werden. Sehen Sie Mark Thalmans Antwort für IMHO, wie Sie es richtig machen. Ludwig Weinzierl vor 14 Jahren 0
Entschuldigung, nicht bei meinem Mac. Hat die Mac-Version von grep nicht das -r-Flag (rekursiv)? dwj vor 14 Jahren 0
Das tut es, aber das war die Ausgabe, die ich bekam, als ich nach einem String suchte, von dem ich weiß, dass er in den Dateien ist. John Topley vor 14 Jahren 0
0
laughing_man
grep "(your string)" -rl $(find ./ -name "*.java") 

Wenn Sie den Fall ignorieren möchten, ersetzen Sie -rl durch -irl. (Ihre Zeichenfolge) kann auch ein Regex sein, wenn Sie die Notwendigkeit erkennen.

-1
Mark Thalman

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