Wie kann ich bestimmte Dateien in einem Verzeichnis rekursiv anzeigen?

9847
Eric Wilson

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

Durch die Verwendung kann find -name *.javaich die Namen aller Java-Dateien in einem bestimmten Verzeichnis finden. Angenommen, ich möchte zählen foo, wie oft in diesen Dateien vorkommt. Wie soll ich das tun?

Ich habe Dinge ausprobiert wie:

grep -r "foo" *.java 

und Antworten erhalten wie:

grep: *.java: No such file or directory 

Irgendwelche Ideen?

13
Dupe: http://superuser.com/questions/3512/ innaM vor 14 Jahren 2
Sorry, ich werde beim nächsten Mal härter aussehen. Bemerkenswert, dass die Fragen so ähnlich waren. Eric Wilson vor 14 Jahren 0
Der Titel von 3512 könnte * viel * besser sein. "Grundlegende Grep-Nutzungsfrage" sagt Ihnen nicht viel über die eigentliche Frage aus. Wir werden wahrscheinlich mehr Dupes haben, wenn das nicht behoben ist. Richard Hoskins vor 14 Jahren 0
@richardhoskins, behoben. John T vor 14 Jahren 0

4 Antworten auf die Frage

15
arathorn
find . -name '*.java' | xargs grep <your pattern here> 
Besser noch, verwenden Sie keine Elemente, die mit einem Leerzeichen versehen sind, damit ein Dateiname mit einem Leerzeichen nicht in zwei Dateinamen aufgeteilt wird: find. -name '* .java' - Typ f -print0 | xargs -0 grep CoverosGene vor 14 Jahren 5
@CoverosGene: Sie können die Option --replace verwenden, um xargs damit umzugehen - wie folgt: ... | xargs --replace grep "{}" arathorn vor 14 Jahren 1
Vielen Dank, ich wusste, dass es einen Befehl geben muss, der 'xargs' tut. Eric Wilson vor 14 Jahren 0
6
user4126

Es gibt ein Werkzeug, das speziell für diese Art von Anforderungen entwickelt wurde: ack .

ack ist ein Programm wie grep, das sich an Programmierer mit großen Bäumen mit heterogenem Quellcode richtet

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

Meh. Ein echtes Unix-Tool benötigt einen rekursiven Namen, der auf sein Erbe hinweist ... wie etwa ABTG's Better Than Grep oder so. ACK? Der einzige gute Gedanke ist, dass der Autor des verbesserten NACK bereits einen Namen ausgewählt hat;) Mikeage vor 14 Jahren 1
Einer der Gründe, warum ich ack wirklich liebe, ist, dass Sie Dateitypen angeben können. Zum Beispiel habe ich mit "ack --html""Es durchsucht alle meine .html -, .htm -, .xhtml -, .dhtml - Dateien auf einmal. Mark van Lent vor 14 Jahren 0
Ack hat Grep für mich ziemlich ersetzt. Ryan Thompson vor 14 Jahren 0
3
Manatok

Wie wäre es mit:

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

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

Willkommen bei SuperUser! Sie werden feststellen, dass Ihre Antworten mehr Beachtung finden, wenn dies zu aktuelleren Fragen (dieses ist von 2009) und wenn Sie erklären, warum Ihre Antwort besser ist als die bereits akzeptierte. Eric Wilson vor 11 Jahren 3
@EricWilson Danke für den Rat :) wudeng vor 11 Jahren 0