Avec find
:
cd /the/dir
find . -type f -exec grep pattern {} +
( -type f
consiste à rechercher uniquement dans les fichiers normaux (excluant également les liens symboliques même s'ils pointent vers des fichiers normaux). Si vous souhaitez rechercher dans n'importe quel type de fichier à l'exception des répertoires (mais attention, il existe certains types de fichiers comme fifos ou / dev / zero qui vous ne voulez généralement pas lire), remplacez -type f
par le spécifique à GNU ! -xtype d
( -xtype d
correspond aux fichiers du répertoire type après la résolution du lien symbolique)).
Avec GNU grep
:
grep -r pattern /the/dir
(mais attention, sauf si vous avez une version récente de GNU grep, cela suivra les liens symboliques lors de la descente dans les répertoires). Les fichiers non réguliers ne seront pas recherchés sauf si vous ajoutez une -D read
option. Cependant, les versions récentes de GNU grep
ne rechercheront toujours pas dans les liens symboliques.
Les très anciennes versions de GNU find
ne prenaient pas en charge la {} +
syntaxe standard , mais là, vous pouviez utiliser la non standard:
cd /the/dir &&
find . -type f -print0 | xargs -r0 grep pattern
Les performances sont susceptibles d'être liées aux E / S. C'est le temps de faire la recherche qui serait le temps nécessaire pour lire toutes ces données du stockage.
Si les données se trouvent sur une grappe de disques redondante, la lecture de plusieurs fichiers à la fois peut améliorer les performances (et les dégrader autrement). Si les performances ne sont pas liées aux E / S (car, par exemple, toutes les données sont dans le cache) et que vous disposez de plusieurs processeurs, l'utilisation simultanée greps
peut également être utile. Vous pouvez le faire avec xargs
l' -P
option GNU .
Par exemple, si les données se trouvent sur une matrice RAID1 avec 3 disques, ou si les données sont dans le cache et que vous avez 3 processeurs dont vous avez le temps:
cd /the/dir &&
find . -type f -print0 | xargs -n1000 -r0P3 grep pattern
(ici, utiliser -n1000
pour générer un nouveau grep
tous les 1000 fichiers, jusqu'à 3 fonctionnant en parallèle à la fois).
Cependant, notez que si la sortie de grep
est redirigée, vous vous retrouverez avec une sortie mal entrelacée des 3 grep
processus, auquel cas vous voudrez peut-être l'exécuter comme:
find . -type f -print0 | stdbuf -oL xargs -n1000 -r0P3 grep pattern
(sur un système GNU ou FreeBSD récent) ou utilisez l' --line-buffered
option GNU grep
.
S'il pattern
s'agit d'une chaîne fixe, l'ajout de l' -F
option pourrait améliorer les choses.
Si ce ne sont pas des données de caractères multi-octets, ou si pour la correspondance de ce modèle, peu importe si les données sont des caractères multi-octets ou non, alors:
cd /the/dir &&
LC_ALL=C grep -r pattern .
pourrait améliorer considérablement les performances.
Si vous finissez souvent par effectuer de telles recherches, vous souhaiterez peut-être indexer vos données à l'aide de l'un des nombreux moteurs de recherche disponibles.
find
avecxargs
ougrep -R