GNU/Linux >> Tutoriels Linux >  >> Linux

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

Essayez

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

Cela devrait rechercher de manière récursive les dossiers sous application pour les fichiers avec .php extension et transmettez-les à grep .

Une optimisation sur ce serait d'exécuter :

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

Cela utilise xargs passer tous les .php fichiers générés par find comme arguments d'un seul grep commande ; par exemple, grep "debug (" file1 file2 file3 . Le -print0 possibilité de find et -0 possibilité de xargs assurez-vous que les espaces dans les noms de fichiers et de répertoires sont correctement gérés. Le -H option passée à grep garantit que le nom de fichier est imprimé dans toutes les situations. (Par défaut, grep affiche le nom du fichier uniquement lorsque plusieurs arguments sont passés.)

De man xargs :

-0

      Les éléments d'entrée se terminent par un caractère nul au lieu d'un espace blanc, et les guillemets et l'anti-sla ne sont pas spéciaux (chaque caractère est pris littéralement). Désactive la chaîne de fin de fichier, qui est traitée comme n'importe quel autre argument. Utile lorsque les éléments d'entrée peuvent contenir des espaces blancs, des guillemets ou des barres obliques inverses. Le GNU trouve -print0 L'option produit une entrée adaptée à ce mode.


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'un seul processus.

Choix :

  • -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.

Linux
  1. Comment rechercher et supprimer des répertoires de manière récursive sous Linux

  2. Comment trouver et tuer le processus Zombie sous Linux

  3. Comment rechercher des fichiers à l'aide de regex dans le script shell Linux

  4. Comment rechercher un fichier dans les fichiers war, ear et jar de manière récursive sous Linux

  5. Comment rechercher un mot dans tout le contenu d'un répertoire sous Linux

Comment utiliser la commande grep sous Linux/UNIX

Comment trouver une chaîne dans un fichier sous Linux

Comment trouver et supprimer des liens symboliques brisés sous Linux

Comment rechercher des fichiers à partir de la ligne de commande Linux

Comment rechercher et supprimer des répertoires vides sous Linux

Comment trouver le nom et la version de la distribution Linux