web-dev-qa-db-fra.com

Comment trouver un texte spécifique dans des fichiers avec une extension spécifique?

Supposons que je recherche tous les fichiers avec l'extension .log contenant le texte de abc.

Lors de la recherche de fichiers avec une extension quelconque, ressemblerait à ceci (Réf.: https://unix.stackexchange.com/a/16140/3835 )

find / -xdev -type f -print0 | xargs -0 grep -H "abc"

Comment pourrions-nous modifier cela afin qu'il ne recherche que les fichiers avec l'extension .log?

Je serai plus qu'heureux si vous montrez un meilleur commandement.

1
Askar

TL; DR

Ajoutez -iname "*.log" après / à votre commande find. Reportez-vous à la page de manuel pour plus d'informations.

ne réponse plus détaillée

La tâche à accomplir est la suivante:

  1. Répertorie les fichiers correspondant au modèle *.log
  2. Exécutez grep pour chaque fichier afin de déterminer s’il contient ou non une chaîne spécifique.
  3. Répertoriez le nom du fichier correspondant à la variable stdout

L'exemple de la façon dont cela peut être accompli peut être vu ci-dessous:

$ find /var/log -iname "*.log" -exec grep -l 'wlan' {} \+                      

Il y a essentiellement 3 choses en jeu:

  • find recherche les fichiers ET appelle grep par liste de noms de fichiers dans la structure -exec ...{} \+, où {} sera remplacé par tous les noms de fichiers trouvés.
  • -iname "*.log" peut fournir une correspondance des noms de fichiers sans distinction de casse
  • -exec . . .{} \+ appelle la fonction _ de bas niveau execve qui générera grep -l avec la liste de tous les fichiers trouvés devant elle (à la place de {}).
  • Le \+ est l’option qui spécifie que execve doit compresser autant de fichiers que possible devant grep (la limite est définie par la variable ARG_MAX, et est spécifique à exec, et pour Ubuntu est à 2097152, comme le montre la commande getconf ARG_MAX. Une fois la limite atteinte, exec répétera l'appel à grep avec plus de fichiers compressés en arguments. Le \ est nécessaire pour s'assurer que + est interprété comme un argument de find et non comme une autre commande Shell.
  • l'option -l ou grep affiche les fichiers avec la chaîne correspondante. -L correspondrait aux fichiers sans la chaîne.
3