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.
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:
*.log
grep
pour chaque fichier afin de déterminer s’il contient ou non une chaîne spécifique.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 {}
).\+
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
ou grep affiche les fichiers avec la chaîne correspondante. -L
correspondrait aux fichiers sans la chaîne.