20 votes

Comment combiner find et grep pour une recherche complexe ? ( GNU/linux, find, grep )

J'essaie d'effectuer une recherche de texte dans certains fichiers qui partagent une structure de répertoire similaire, mais qui ne se trouvent pas dans la même arborescence de répertoires, sous GNU/Linux.

J'ai un serveur web avec de nombreux sites qui partagent la même arborescence (framework PHP Code Igniter MVC), je veux donc effectuer une recherche dans un répertoire spécifique de l'arborescence pour chaque site, par exemple :

/srv/www/*/htdocs/system/application/

Où * est le nom du site. Et à partir de ces application Je veux rechercher dans tout l'arbre jusqu'à ses feuilles, un fichier *.php qui contient un certain modèle de texte, disons "debug(", sans expression régulière.

Je sais comment utiliser trouver y grep mais je ne suis pas doué pour les combiner.

Comment dois-je m'y prendre ?
Merci d'avance !

25voto

Essayez

find /srv/www/*/htdocs/system/application/ -name "*.php" -exec grep "debug (" {} \; -print

Ceci devrait rechercher récursivement les dossiers sous application pour les fichiers avec .php et les transmettre à grep .

Une optimisation sur ce point serait d'exécuter :

find /srv/www/*/htdocs/system/application/ -name "*.php" -print0 | xargs -0 grep -H "debug ("

Cela utilise xargs pour passer tous les .php fichiers produits par find comme arguments à un seul grep commande ; par exemple, grep "debug (" _file1 file2 file3_ . Le site -print0 option de find y -0 option de xargs s'assurer que les espaces dans les noms de fichiers et de répertoires sont correctement gérés. Le site -H passée à l'option grep garantit que le nom de fichier est imprimé dans toutes les situations. (Par défaut, grep imprime le nom du fichier uniquement lorsque plusieurs arguments sont passés).

De man xargs :

-0

Les éléments d'entrée sont terminés par un caractère nul au lieu d'un espace, et les guillemets et la barre oblique inversée. ne sont pas spéciaux (chaque caractère est pris littéralement).  Désactive la fin de la chaîne de caractères du fichier, qui est est traitée comme tout autre argument.  Utile lorsque les éléments d'entrée peuvent contenir des espaces, des guillemets ou des barres obliques inversées. barres obliques inversées.  Le GNU find -print0 produit une entrée adaptée à ce mode.

12voto

Daniel Andersson Points 22765

find n'est même pas nécessaire pour cet exemple, on peut utiliser grep directement (au moins GNU grep ):

grep -RH --include='*.php' "debug (" /srv/www/*/htdocs/system/application/

et nous n'avons plus qu'une seule fourchette de processus.

Options :

  • -R, --dereference-recursive Read all files under each directory, recursively. Follow all symbolic links, unlike -r.
  • -H, --with-filename Print the file name for each match. This is the default when there is more than one file to search.
  • --include=GLOB Search only files whose base name matches GLOB (using wildcard matching as described under --exclude).
  • --exclude=GLOB Skip any command-line file with a name suffix that matches the pattern GLOB, using wildcard matching; a name suffix is either the whole name, or any suffix starting after a / and before a +non-/. When searching recursively, skip any subfile whose base name matches GLOB; the base name is the part after the last /. A pattern can use *, ?, and [...] as wildcards, and \ to quote a wildcard or backslash character literally.

0voto

user2394284 Points 1271

Votre Shell peut trouver les fichiers php et les donner à grep. En bash :

shopt -s nullglob globstar
grep searchterm /srv/www/*/htdocs/system/application/**/*.php

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X