Il existe deux solutions faciles pour cela. Fondamentalement, en utilisant xargs
ou parallel
.
Approche de xargs:
Vous pouvez utiliser xargs
avec find
comme suit:
find . -type f -print0 | xargs -0 -P number_of_processes grep mypattern > output
Où vous allez remplacer number_of_processes
par le nombre maximal de processus que vous souhaitez lancer. Toutefois, cela ne garantit pas une performance significative au cas où vos performances seraient limitées en entrées / sorties. Dans ce cas, vous pouvez essayer de démarrer plusieurs processus pour compenser le temps perdu à attendre des E / S.
En outre, avec l’inclusion de find, vous pouvez spécifier des options plus avancées au lieu de simplement des modèles de fichiers, tels que la date de modification, etc.
Un problème possible avec cette approche, comme l'expliquent les commentaires de Stéphane, xargs
peut ne pas démarrer suffisamment de processus s'il y a peu de fichiers . Une solution consiste à utiliser l' -n
option pour xargs
spécifier le nombre d'arguments à prendre à la fois dans le canal. Le réglage -n1
obligera xargs
à démarrer un nouveau processus pour chaque fichier. Ce comportement peut être souhaité si les fichiers sont très volumineux (comme dans le cas de cette question) et si le nombre de fichiers est relativement petit. Toutefois, si les fichiers eux-mêmes sont petits, les frais généraux liés au démarrage d’un nouveau processus risquent de compromettre l’avantage du parallélisme, auquel cas une -n
valeur plus grande sera meilleure. Ainsi, l' -n
option peut être ajustée en fonction de la taille et du nombre de fichiers.
Approche parallèle:
Une autre façon de le faire est d'utiliser l'outil Ole Tange GNU Parallel parallel
(disponible ici ). Cela offre un meilleur contrôle du parallélisme et peut même être réparti sur plusieurs hôtes (serait avantageux si votre répertoire est partagé, par exemple). La syntaxe la plus simple utilisant parallèle sera:
find . -type f | parallel -j+1 grep mypattern
lorsque l'option -j+1
indique en parallèle de démarrer un processus au-delà du nombre de cœurs sur votre machine (cela peut être utile pour les tâches limitées d'E / S, vous pouvez même essayer d'augmenter le nombre).
Parallèle a également l'avantage xargs
de conserver réellement l'ordre de la sortie de chaque processus et de générer une sortie contiguë. Par exemple, avec xargs
, si le processus 1 génère une ligne p1L1
, le processus 2 génère une ligne p2L1
, le processus 1 génère une autre ligne p1L2
, le résultat sera:
p1L1
p2L1
p1L2
alors qu'avec parallel
la sortie devrait être:
p1L1
p1L2
p2L1
Ceci est généralement plus utile que la xargs
sortie.