Je dois trouver toutes les occurrences de 'filename.ext' sur un système Linux et voir celles qui contiennent le texte 'lookingfor'.
Existe-t-il un ensemble d’opérations en ligne de commande linux qui fonctionneraient?
find / -type f -name filename.ext -exec grep -l 'lookingfor' {} +
L'utilisation d'un +
pour terminer la commande est plus efficace que \;
car find
envoie un lot complet de fichiers à grep
au lieu de les envoyer un par un. Cela évite un fork/exec pour chaque fichier trouvé.
Il y a quelque temps, j'ai fait quelques essais pour comparer les performances de xargs
par rapport à {} +
par rapport à {} \;
et j'ai découvert que {} +
était plus rapide. Voici quelques-uns de mes résultats:
time find . -name "*20090430*" -exec touch {} +
real 0m31.98s
user 0m0.06s
sys 0m0.49s
time find . -name "*20090430*" | xargs touch
real 1m8.81s
user 0m0.13s
sys 0m1.07s
time find . -name "*20090430*" -exec touch {} \;
real 1m42.53s
user 0m0.17s
sys 0m2.42s
Allez dans le répertoire respectif et tapez la commande suivante.
trouver . -name "* .ext" | xargs grep 'à la recherche de'
Un plus simple serait,
find / -type f -name filename.ext -print0 | xargs -0 grep 'lookingfor'
-print0 pour trouver & 0 à xargs atténuerait le problème du grand nombre de fichiers dans un seul répertoire.
Essayer:
find / -type f -name filename.ext -exec grep -H -n 'lookingfor' {} \;
find
cherche récursivement à partir de la racine /
pour les fichiers nommés filename.ext
et pour chaque occurrence trouvée, grep s'exécute sur le nom du fichier en recherchant lookingfor
et, le cas échéant, imprime le numéro de ligne (-n
) et le nom du fichier (-H
).
Je trouve la commande suivante la manière la plus simple:
grep -R --include="filename.ext" lookingfor
ou ajoutez -i
à la recherche insensible à la casse:
grep -i -R --include="filename.ext" lookingfor