Si vous utilisez -r
, vous souhaiterez probablement rechercher récursivement uniquement le répertoire courant :
grep -r 'class MyClass' .
Notez la période à la fin de ce qui précède.
Ce que vous avez dit, grep
c'est que vous vouliez qu'il recherche récursivement chaque *.php
fichier ou répertoire , mais vous n'aviez probablement aucun répertoire se terminant par une extension .php. Ce qui précède est le moyen le plus simple de faire la recherche, mais inclut également des fichiers d'autres types, ce qui est particulièrement problématique lorsque vous avez des répertoires .svn partout. Si vous n'avez pas beaucoup d'autres types de fichiers, ce qui précède est généralement suffisant et fonctionne bien.
La plupart des incarnations de grep n'ont pas de moyen de spécifier les extensions de fichier qui peuvent être recherchées, vous utilisez donc généralement find conjointement avec lui:
find <startDir> -iname '*.php' -exec grep 'class[ \t]*MyClass' {} \;
-iname
indique à certaines versions de grep que vous souhaitez effectuer une recherche de nom de fichier insensible à la casse, mais que de nombreuses variantes non GNU de find ne le prennent pas en charge, vous pouvez donc l'utiliser à la -name
place.
L' -exec
option ci-dessus a pour effet secondaire d'invoquer grep pour chaque fichier, ce qui est assez coûteux.
D'autres versions de grep prennent en charge un +
qui indique à find d'ajouter les arguments ensemble pour réduire le nombre d'appels de l'exécutable:
find <startDir> -iname '*.php' -exec grep 'class[ \t]*MyClass' {} + \;
Un moyen fréquemment recommandé de réduire les invocations consiste à utiliser des xargs qui déclencheront grep aussi peu de fois que possible mais autant de fois que nécessaire:
find <startDir> -iname \*.php | xargs grep "class[ \t]*MyClass"
xargs
est assez intelligent pour passer grep jusqu'au nombre maximum d'arguments pris en charge sur la ligne de commande, mais la variation ci-dessus ne gère pas très bien certains caractères comme les espaces. Par exemple, si «le fichier.php» un grep de nom de fichier recevrait «le» en tant qu'argument et «fichier.php» en tant qu'argument afin que les deux ne soient pas trouvés. Au lieu de cela, nous utilisons:
find <startDir> -iname \*.php -print0 | xargs -0 grep "class[ \t]*MyClass"
print0
et -0
travailler ensemble et utiliser des arguments suivis d'un caractère nul pour que l'argument soit complètement et sans ambiguïté identifié.
Si vous avez plus d'un espace après class
, ou un onglet, vous voudrez peut-être autoriser plus de caractères en changeant l'expression régulière:class[ \t]*MyClass
Ce message sur StackOverflow contient d'autres exemples et montre comment exclure certains répertoires, comme les répertoires .svn.
grep -r
ne vous a pas donné.