Wie kann ich bestimmte Dateien in einem Verzeichnis rekursiv prüfen?

14

Ich bin neu in Linux und Grep und versuche, mich zurechtzufinden.

Durch die Verwendung von kann find -name *.javaich die Namen aller Java-Dateien in einem bestimmten Verzeichnis finden. Angenommen, ich möchte zählen foo, wie oft diese Dateien vorkommen. Wie würde ich das tun?

Ich habe Dinge ausprobiert wie:

grep -r "foo" *.java

und bekommen Antworten wie:

grep:  *.java:  No such file or directory

Irgendwelche Ideen?

Eric Wilson
quelle
1
Entschuldigung, ich werde das nächste Mal härter aussehen. Bemerkenswert, dass die Fragen so ähnlich waren.
Eric Wilson
1
Der Titel von 3512 könnte viel besser sein. "Basic grep usage question" sagt nicht viel über die eigentliche Frage aus. Wir werden wahrscheinlich mehr Dupes haben, wenn das nicht behoben ist.
Richard Hoskins
1
@richardhoskins, behoben.
John T

Antworten:

16
find . -name '*.java' | xargs grep <your pattern here>
Arathorn
quelle
5
Verwenden Sie noch besser nullterminierte Elemente, damit ein Dateiname mit einem Leerzeichen nicht in zwei Dateinamen aufgeteilt wird: find. -name '* .java' -Typ f -print0 | xargs -0 grep <Ihr Muster hier>
CoverosGene
1
@CoverosGene: Sie können die Option --replace verwenden, um xargs so zu behandeln: ... | xargs --replace grep "{}" <pattern>
arathorn
Vielen Dank, ich wusste, dass es einen Befehl geben muss, der tut, was xargstut.
Eric Wilson
6

Es gibt ein speziell für diesen Bedarf entwickeltes Werkzeug: ack .

ack ist ein Tool wie grep, das sich an Programmierer mit großen Bäumen heterogenen Quellcodes richtet

Lesen Sie auch die "10 wichtigsten Gründe für die Verwendung von ack anstelle von grep". auf der ack Seite.

user4126
quelle
1
Meh. Ein echtes Unix-Tool braucht einen rekursiven Namen, der auf sein Erbe verweist ... wie etwa abtg [ABTG's Better Than Grep] oder so. ACK? Das einzig gute daran ist, dass der Autor des verbesserten NACK bereits einen Namen ausgewählt hat;)
Mikeage
Einer der Gründe, warum ich ack wirklich liebe, ist, dass Sie Dateitypen angeben können. Zum Beispiel durchsucht ich mit "ack --html <Muster>" alle meine .html-, .htm-, .xhtml-, .dhtml- usw. -Dateien auf einmal.
Mark van Lent
Ack hat grep für mich so ziemlich ersetzt.
Ryan C. Thompson
3

Wie wäre es mit:

grep -irn --include="*\.java" somePhrase *
Manatok
quelle
0

finden . -type f -name '* .java' -print0 | xargs -0 grep -wo 'foo' | wc -l

wudeng
quelle
3
Willkommen bei SuperUser! Sie werden feststellen, dass Ihre Antworten mehr Aufmerksamkeit erhalten, wenn es sich um aktuellere Fragen handelt (diese stammen aus dem Jahr 2009) und wenn Sie erklären, warum Ihre Antwort besser ist als die bereits akzeptierte.
Eric Wilson