Come posso greppare in modo ricorsivo determinati file in una directory?


14

Sono nuovo di Linux e di grep e sto cercando di orientarmi.

Usando find -name *.java Sono in grado di trovare i nomi di tutti i file java in una particolare directory. Supponiamo che voglio contare il numero di volte foo si verifica in questi file, come dovrei farlo?

Ho provato cose come:

grep -r "foo" *.java

e ottenere risposte come:

grep:  *.java:  No such file or directory

Qualche idea?



1
Scusa, la prossima volta guarderò con più attenzione. Notevole che le domande erano così simili.
Eric Wilson

1
Il titolo di 3512 potrebbe essere un lotto meglio. "La domanda basilare sull'uso di grep" non ti dice molto sulla domanda vera e propria. Probabilmente avremo più duplicati a meno che non sia corretto.
Richard Hoskins

1
@richardhoskins, risolto.
John T

Risposte:


16
find . -name '*.java' | xargs grep <your pattern here>

5
Meglio ancora, usa oggetti terminati con null in modo che il nome di un file con uno spazio al suo interno non venga diviso in due nomi di file: find. -name '* .java' -type f -print0 | xargs -0 grep & lt; il tuo pattern qui & gt;
CoverosGene

1
@CoverosGene: puoi usare l'opzione --replace per xargs per gestirlo - come questo: ... | xargs --replace grep "{}" & lt; pattern & gt;
arathorn

grazie mille, sapevo che doveva esserci un comando che fa cosa xargs lo fa.
Eric Wilson

6

C'è uno strumento appositamente progettato per questo tipo di necessità: ack .

ack è uno strumento come grep, rivolto a programmatori con grandi alberi di codice sorgente eterogeneo

Leggi anche il "I 10 principali motivi per usare ack invece di grep." al ack pagina.


1
Meh. Un vero strumento unix ha bisogno di un nome ricorsivo che si riferisca al suo retaggio ... come abtg [ABTG's Better Than Grep], o qualcosa del genere. ACK? L'unico aspetto positivo è che l'autore del miglioramento di NACK ha già un nome scelto;)
Mikeage

Uno dei motivi per cui amo davvero ack è che puoi specificare i tipi di file. Ad esempio, io con "ack --html & lt; pattern & gt;" Cerca tutti i miei file .html, .htm, .xhtml, .dhtml, ecc. in una volta sola.
Mark van Lent

Ack ha praticamente sostituito grep per me.
Ryan Thompson

3

Che dire:

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

0

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


3
Benvenuto in SuperUser! Scoprirai che le tue risposte ottengono maggiore attenzione quando si tratta di domande più attuali (questa è del 2009) e quando spieghi perché la tua risposta è migliore di quella già accettata.
Eric Wilson

@EricWilson grazie per il consiglio :)
wudeng
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.