Grep tous les fichiers .java dans un répertoire pour une chaîne particulière

Comment recherchez-vous tous les fichiers .java pour une chaîne simple (pas un regex) dans le répertoire actuel et tous les sous-répertoires sur Mac OS X? Je veux simplement imprimer une liste de noms de fichiers et de répertoires qui correspondent.

Et le toujours populaire

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

EDIT (par Frank Szczerba):

Si vous rencontrez des noms de fichiers ou des répertoires qui ont des espaces, la façon la plus sûre de le faire est:

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

Il y a toujours plus d'une façon de le faire.

La réponse UNIX traditionnelle serait celle qui a été acceptée pour cette question:

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

Cela fonctionnera probablement pour les fichiers Java, mais les espaces dans les noms de fichiers sont beaucoup plus communs sur Mac que dans le monde classique UNIX. Lorsque les noms de fichiers avec des espaces sont passés à travers le pipeline ci-dessus, les xargs interpréteront les mots individuels comme des noms différents.

Ce que vous voulez vraiment, c'est de ne pas séparer les noms pour rendre les limites sans ambiguïté:

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

L'alternative est de laisser aller la course grep pour vous, comme le suggère Mark, bien que cette approche soit plus lente si vous recherchez un grand nombre de fichiers (car grep est invoqué une fois par fichier plutôt qu'une fois avec toute la liste des fichiers).

Utilisez le grep qui vaut mieux que grep, ack :

 ack -l --java "string" 

Cela va effectivement utiliser un regex si vous le souhaitez, restez loin des métacaractères, ou échappez-vous, et vous pouvez rechercher des chaînes.

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

 grep -rl --include="*.java" simplestring * 

Comme il s'agit d'une question OSX, voici une réponse plus spécifique à OSX.

Passez find et utilisez Spotlight partir de la ligne de commande. Beaucoup plus puissant!

COMMAND LINE SPOTLIGHT – TROUVER MEETS GREP

La plupart des gens ne savent pas que vous pouvez faire des recherches Spotlight à partir de la ligne de commande. Pourquoi souvenez-vous de toutes les options arcin trouver et grep et ce n'est pas quand vous pouvez laisser Spotlight faire le travail pour vous. L'interface de ligne de commande à Spotlight s'appelle mdfind. Il a tout le même pouvoir que la recherche GUI Spotlight et plus, car il est scriptable à la ligne de commande!

Donnez-lui un aller:

 grep -rl "string" */*java 
 grep "(your string)" -rl $(find ./ -name "*.java") 

Si vous souhaitez ignorer le cas, remplacez -rl par -irl. (Votre chaîne) peut également être un regex si vous avez déjà vu le besoin.

Vous pouvez également utiliser un programme GUI comme TextWrangler pour effectuer une recherche plus intuitive où les options se trouvent dans l'interface.