Eu tenho um problema de script de shell onde recebo um diretório cheio de arquivos de entrada (cada arquivo contém muitas linhas de entrada), e eu preciso processá-los individualmente, redirecionando cada uma das suas saídas para um arquivo exclusivo (também conhecido como file_1 .input precisa ser capturado em file_1.output e assim por diante).
Pré-paralelo , eu apenas faria uma iteração sobre cada arquivo no diretório e executaria meu comando, enquanto fazia algum tipo de técnica de contagem / temporização para não sobrecarregar os processadores (supondo que cada processo tenha um tempo de execução constante). No entanto, sei que nem sempre será esse o caso, portanto, usar uma solução semelhante a "paralela" parece ser a melhor maneira de obter o multi-threading de script de shell sem escrever código personalizado.
Embora eu tenha pensado em algumas maneiras de trabalhar paralelamente para processar cada um desses arquivos (e permitir que eu gerencie meus núcleos de forma eficiente), todos eles parecem hacky. Eu tenho o que eu acho que é um caso de uso muito fácil, então prefiro mantê-lo o mais limpo possível (e nada nos exemplos paralelos parece saltar como sendo o meu problema.
Qualquer ajuda seria apreciada!
exemplo de diretório de entrada:
> ls -l input_files/
total 13355
location1.txt
location2.txt
location3.txt
location4.txt
location5.txt
Script:
> cat proces_script.sh
#!/bin/sh
customScript -c 33 -I -file [inputFile] -a -v 55 > [outputFile]
Atualizar :
Depois de ler a resposta de Ole abaixo, consegui juntar as peças que faltavam para minha própria implementação paralela. Enquanto sua resposta é ótima, aqui estão minhas pesquisas e anotações:
Em vez de executar meu processo completo, resolvi começar com um comando de prova de conceito para provar sua solução em meu ambiente. Veja minhas duas diferentes implementações (e notas):
find /home/me/input_files -type f -name *.txt | parallel cat /home/me/input_files/{} '>' /home/me/output_files/{.}.out
Usa localizar (não ls, que podem causar problemas) para localizar todos os arquivos aplicáveis no diretório de arquivos de entrada e, em seguida, redireciona o conteúdo para um diretório e arquivo separados. Meu problema de cima estava lendo e redirecionando (o script real era simples), então substituir o script pelo gato era uma boa prova de conceito.
parallel cat '>' /home/me/output_files/{.}.out ::: /home/me/input_files/*
Esta segunda solução usa o paradigma de variáveis de entrada do paralelismo para ler os arquivos, no entanto, para um iniciante, isso era muito mais confuso. Para mim, usar o find a e o pipe satisfaz minhas necessidades.