find . -name '*.py' -exec grep something {} \; -print
afficherait le nom du fichier après les lignes correspondantes.
find . -name '*.py' -exec grep something /dev/null {} +
afficherait le nom du fichier devant chaque ligne correspondante (nous ajoutons /dev/null
pour le cas où il n'y a qu'un seul fichier correspondant car grep
n'imprime pas le nom du fichier s'il est passé qu'un seul fichier à regarder. L'implémentation GNU de grep
a une -H
option pour cela comme alternative).
find . -name '*.py' -exec grep -l something {} +
afficherait uniquement les noms de fichier des fichiers qui ont au moins une ligne correspondante.
Pour imprimer le nom du fichier avant les lignes correspondantes, vous pouvez utiliser awk à la place:
find . -name '*.py' -exec awk '
FNR == 1 {filename_printed = 0}
/something/ {
if (!filename_printed) {
print FILENAME
filename_printed = 1
}
print
}' {} +
Ou appelez grep
deux fois pour chaque fichier - mais ce serait moins efficace car il exécuterait au moins une grep
commande et jusqu'à deux pour chaque fichier (et lirait le contenu du fichier deux fois):
find . -name '*.py' -exec grep -l something {} \; \
-exec grep something {} \;
Dans tous les cas, vous ne voulez pas faire une boucle sur la sortie de ce find
genre et n'oubliez pas de citer vos variables .
Si vous vouliez utiliser une boucle shell, avec les outils GNU:
find . -name '*.py' -exec grep -l --null something {} + |
xargs -r0 sh -c '
for file do
printf "%s\n" "$file"
grep something < "$file"
done' sh
(fonctionne également sur FreeBSD et ses dérivés).