Existem duas soluções fáceis para isso. Basicamente, usando xargs
ou parallel
.
Abordagem xargs:
Você pode usar xargs
com find
o seguinte:
find . -type f -print0 | xargs -0 -P number_of_processes grep mypattern > output
Onde você substituirá number_of_processes
pelo número máximo de processos que deseja iniciar. No entanto, isso não garante que você tenha um desempenho significativo caso seu desempenho seja limitado de E / S. Nesse caso, você pode tentar iniciar mais processos para compensar o tempo perdido na espera de E / S.
Além disso, com a inclusão de find, você pode especificar opções mais avançadas em vez de apenas padrões de arquivo, como tempo de modificação, etc ...
Um possível problema com essa abordagem, conforme explicado pelos comentários de Stéphane, se houver poucos arquivos, xargs
pode não iniciar muitos processos para eles. Uma solução será usar a -n
opção para xargs
especificar quantos argumentos devem ser retirados do canal por vez. A configuração -n1
forçará o xargs
início de um novo processo para cada arquivo único. Esse pode ser um comportamento desejado se os arquivos forem muito grandes (como no caso desta pergunta) e houver um número relativamente pequeno de arquivos. No entanto, se os arquivos forem pequenos, a sobrecarga de iniciar um novo processo poderá prejudicar a vantagem do paralelismo, caso em que um -n
valor maior será melhor. Portanto, a -n
opção pode ser ajustada de acordo com o tamanho e o número do arquivo.
Abordagem Paralela:
Outra maneira de fazer isso é usar a ferramenta Ole Tange GNU Parallel parallel
, (disponível aqui ). Isso oferece maior controle de granulação fina sobre paralelismo e pode até ser distribuído por vários hosts (seria benéfico se seu diretório fosse compartilhado, por exemplo). A sintaxe mais simples usando paralelo será:
find . -type f | parallel -j+1 grep mypattern
onde a opção -j+1
instrui paralelamente a iniciar um processo além do número de núcleos em sua máquina (isso pode ser útil para tarefas limitadas de E / S, você pode até tentar aumentar em número).
O paralelo também tem a vantagem xargs
de realmente reter a ordem da saída de cada processo e gerar uma saída contígua. Por exemplo, com xargs
, se o processo 1 gerar uma linha p1L1
, digamos , o processo 2 gerar uma linha p2L1
, o processo 1 gerar outra linha p1L2
, a saída será:
p1L1
p2L1
p1L2
considerando que com parallel
a saída deve ser:
p1L1
p1L2
p2L1
Isso geralmente é mais útil que a xargs
saída.