Ci sono due soluzioni facili per questo. Fondamentalmente, usando xargs
o parallel
.
Approccio xargs:
È possibile utilizzare xargs
con find
il seguente:
find . -type f -print0 | xargs -0 -P number_of_processes grep mypattern > output
Dove sostituirai number_of_processes
con il numero massimo di processi che desideri avviare. Tuttavia, ciò non è garantito per offrire prestazioni significative nel caso in cui le prestazioni siano limitate in termini di I / O. Nel qual caso potresti provare ad avviare più processi per compensare il tempo perso in attesa di I / O.
Inoltre, con l'inclusione di find, è possibile specificare opzioni più avanzate anziché solo modelli di file, come il tempo di modifica, ecc ...
Un possibile problema con questo approccio, come spiegato dai commenti di Stéphane, se ci sono pochi file, xargs
potrebbe non avviare abbastanza processi per loro. Una soluzione sarà quella di utilizzare l' -n
opzione per xargs
specificare quanti argomenti dovrebbero prendere dalla pipe alla volta. L'impostazione -n1
forzerà xargs
l'avvio di un nuovo processo per ogni singolo file. Questo potrebbe essere un comportamento desiderato se i file sono molto grandi (come nel caso di questa domanda) e c'è un numero relativamente piccolo di file. Tuttavia, se i file stessi sono piccoli, il sovraccarico di iniziare un nuovo processo potrebbe minare il vantaggio del parallelismo, nel qual caso un -n
valore maggiore sarà migliore. Pertanto, l' -n
opzione potrebbe essere ottimizzata in base alle dimensioni e al numero del file.
Approccio parallelo:
Un altro modo per farlo è utilizzare lo strumento Parallelo Ole Tange GNU parallel
(disponibile qui ). Ciò offre un maggiore controllo del parallelismo e può anche essere distribuito su più host (sarebbe utile se la tua directory fosse condivisa, ad esempio). La sintassi più semplice usando il parallelo sarà:
find . -type f | parallel -j+1 grep mypattern
dove l'opzione -j+1
indica al parallelo di avviare un processo in eccesso rispetto al numero di core sulla macchina (questo può essere utile per le attività limitate di I / O, si può anche provare ad aumentare il numero).
Parallelamente ha anche il vantaggio xargs
di conservare effettivamente l'ordine dell'output di ciascun processo e generare un output contiguo. Ad esempio, xargs
se, se il processo 1 genera una riga p1L1
, il processo 2 genera una riga p2L1
, il processo 1 genera un'altra riga p1L2
, l'output sarà:
p1L1
p2L1
p1L2
mentre con parallel
l'output dovrebbe essere:
p1L1
p1L2
p2L1
Questo di solito è più utile xargs
dell'output.