Execute o comando em vários arquivos correspondentes a um padrão em paralelo

2

Digamos que eu tenha um comando aceitando um único argumento, que é um caminho de arquivo:

mycommand myfile.txt

Agora, quero executar esse comando em vários arquivos em paralelo, mais especificamente, o padrão de correspondência de arquivo myfile* .

Existe uma maneira fácil de conseguir isso?

    
por vonPetrushev 25.02.2016 / 12:28

3 respostas

8

Com GNU xargs e um shell com suporte para substituição de processos

xargs -r -0 -P4 -n1 -a <(printf '%s
printf '%s
find . -name 'myfile*' -type f -print0
' myfile* | xargs -r -0 -P4 -n1 mycommand
' myfile*) mycommand

Correria até 4 mycommand s em paralelo.

Se mycommand não usar seu stdin, você também pode fazer:

xargs -r -0 -P4 -n1 -a <(printf '%s
printf '%s
find . -name 'myfile*' -type f -print0
' myfile* | xargs -r -0 -P4 -n1 mycommand
' myfile*) mycommand

Que também funcionaria com o xargs dos BSDs modernos.

Para uma pesquisa recursiva de myfile* files, substitua o comando printf por:

%pre%

( -type f é somente para arquivos regulares. Para um equivalente glob, você precisa de zsh e seu printf '%s%code%' myfile*(.) ).

    
por 25.02.2016 / 12:33
7

Usando um loop:

for f in myfile*; do
  mycommand "$f" &
done

wait

ou usando o paralelo GNU .

    
por 25.02.2016 / 12:31
1

Usando o GNU Parallel, é assim:

parallel mycommand ::: myfile*

Ele executará um trabalho por núcleo.

O GNU Parallel é um paralelizador geral e facilita a execução de trabalhos em paralelo na mesma máquina ou em várias máquinas para as quais você tem acesso ssh. Muitas vezes, pode substituir um loop for .

Se você tem 32 tarefas diferentes que você quer rodar em 4 CPUs, uma maneira direta de paralelizar é rodar 8 tarefas em cada processador:

OGNUParallelgeraumnovoprocessoquandoumtermina-mantendoasCPUsativaseeconomizandotempo:

Instalação

Se o GNU Parallel não for empacotado para sua distribuição, você poderá fazer uma instalação pessoal, que não requer acesso root. Isso pode ser feito em 10 segundos ao fazer isso:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Para outras opções de instalação, consulte o link

Saiba mais

Veja mais exemplos: link

Assista aos vídeos de introdução: link

Percorra o tutorial: link

Inscreva-se na lista de e-mail para obter suporte: link

    
por 25.02.2016 / 21:59