Comment puis-je récursivement récurer des fichiers particuliers dans un répertoire?

14

Je suis nouveau sur linux et grep, et j'essaie de trouver mon chemin.

En utilisant, find -name *.javaje peux trouver les noms de tous les fichiers java dans un répertoire particulier. Supposons que je veuille compter le nombre de fois foodans ces fichiers, comment faire?

J'essaye des choses comme:

grep -r "foo" *.java

et obtenir des réponses comme:

grep:  *.java:  No such file or directory

Des idées?

Eric Wilson
la source
1
Désolé, je vais chercher plus loin la prochaine fois. Remarquable que les questions étaient si similaires.
Eric Wilson
1
Le titre de 3512 pourrait être bien meilleur. La «question de base sur l'utilisation de grep» ne vous en dit pas beaucoup sur la vraie question. Nous aurons probablement plus de dupes à moins que cela ne soit corrigé.
Richard Hoskins
1
@richardhoskins, fixe.
John T

Réponses:

16
find . -name '*.java' | xargs grep <your pattern here>
arathorn
la source
5
Mieux encore, utilisez des éléments terminés par null afin qu'un nom de fichier avec un espace ne soit pas divisé en deux noms de fichier: find. -nom '* .java' -type f -print0 | xargs -0 grep <votre modèle ici>
CoverosGene
1
@CoverosGene: Vous pouvez utiliser l'option --replace pour xargs pour gérer cela - comme ceci: ... | xargs --replace grep "{}" <pattern>
arathorn
merci beaucoup, je savais qu'il devait y avoir une commande qui fait ce qui xargsfait.
Eric Wilson
6

Il existe un outil spécialement conçu pour ce type de besoin: ack .

ack est un outil comme grep, destiné aux programmeurs avec de grandes arborescences de code source hétérogène

Lisez également le "Top 10 des raisons d'utiliser ack au lieu de grep." à la page d' ack .

user4126
la source
1
Meh. Un véritable outil Unix a besoin d'un nom récursif qui fait référence à son héritage ... comme abtg [Better Than Grep d'ABTG], ou quelque chose. ACK? Le seul bon point à ce sujet est que l'auteur du NACK amélioré a déjà choisi un nom;)
Mikeage
L'une des raisons pour lesquelles j'aime vraiment ack est que vous pouvez spécifier des types de fichiers. Par exemple, avec "ack --html <pattern>", il recherche tous mes fichiers .html, .htm, .xhtml, .dhtml, etc. en une seule fois.
Mark van Lent
Ack a quasiment remplacé grep pour moi.
Ryan C. Thompson, le
3

Qu'en est-il de:

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

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

wudeng
la source
3
Bienvenue sur SuperUser! Vous constaterez que vos réponses reçoivent plus d'attention lorsqu'il s'agit de questions plus actuelles (celle-ci date de 2009) et lorsque vous expliquez pourquoi votre réponse est meilleure que celle déjà acceptée.
Eric Wilson