web-dev-qa-db-fra.com

Comment rechercher une chaîne dans A PHP fichier en utilisant `grep`?

Je cherche une déclaration de classe sur un site avec des centaines de PHP fichiers. Comment puis-je faire cela dans le dossier et les sous-dossiers en cours à l'aide de grep ?

J'ai testé cding au dossier, puis quelque chose comme

grep -r 'class MyClass' *.php
11
Sam3k

Tu peux essayer

grep -r --include=*.php "search string" /path/to/dir
24
rahul286

Je vous recommanderais d'utiliser quelque chose comme - CTAG plutôt que de le faire avec un grep. Cependant, si vous voulez, vous pouvez faire quelque chose comme

 find <top level dir> -name \*.php | xargs grep "class MyClass"

Cela suppose bien sûr que vous n'avez qu'un seul espace entre class et myClass qui pourrait ne pas être vrai. Il est facile de changer le Regexp pour rechercher un nombre quelconque d'espaces.

9
Noufal Ibrahim

En utilisant le merveilleux ( ACK ,

ack --php 'class MyClass'
3
ephemient
grep -rl 'class MyClass' . --include \*.php

l ne montre que le nom de fichier

r est récursif

. Recherches dans le dossier actuel

--Clueut la limitation du nom de fichier

1
Full

Si les fichiers correspondants peuvent avoir des noms arbitraires, vous devriez envisager d'utiliser -print0

trouver . -Type f -name '* .php' -print0 | Xargs -0 Grep 'Classe MyClass'

1
wudeng

Vous voulez probablement que la tolérance à l'insensibilité et à l'espoie de cas, et le GREP terminera s'il ne trouve aucun instance du modèle de fichier souhaité dans le répertoire actuel. Il faut savoir où commencer, tel qu'il était, et aucun fichier apparié ne produit aucun chemin de départ.

S'il y a au moins un fichier de l'extension souhaitée, vous pouvez utiliser Egrep -ir. find et xargs _ montre leur pouvoir avec des annuaires à plat unique (mais très grand) que Grep échoue sur et des qualificateurs supplémentaires (par exemple si vous souhaitez rechercher des fichiers .C, .php et php3 seulement). Mais cela perd un peu de commodité et de rapidité de mon expérience. Pour les déclarations de classe écrite humaine, un gros problème va être des espaces. Alors utilisez Egrep au lieu de grep. Aussi lc_all = c pour plus de vitesse. Pour plus de commodité, j'utilise souvent:

LC_ALL=C egrep -irn "class[ ]*myclass([ ]|\n)" * | egrep "\.(inc|php[35]?)"

-i -- case insensitive
-r -- recursive for all file pattern (here *)
-n -- include the line number
LC_ALL=C -- search in ASCII, not in utf8, this is much faster.

[ ]* -- match any number of spaces before the class name
([ ]|\n) -- match a space or newline after the classname

Cela peut toujours faire correspondre des commentaires, tels que // class myclass exists in file, mais je trouve que ceux-ci sont petits relativement et ils peuvent être filtrés avec ... | fgrep -v '//'

Vous pouvez également inclure des masques de fichiers plus complexes (par exemple, pour attraper la plupart des fichiers .Inc et .php) sur le modèle de fichier Egrep comme si:

egrep "pattern" *.[ip]*

Que (avec les premières options) sera assez rapide et surtout limitée aux fichiers PHP.

Ht

1
Beracah