Eu tenho um problema de script de shell no qual recebo um diretório cheio de arquivos de entrada (cada arquivo contém muitas linhas de entrada) e preciso processá-los individualmente, redirecionando cada uma de suas saídas para um arquivo exclusivo (também conhecido como file_1.input para ser capturado em file_1.output e assim por diante).
Antes do paralelo , eu simplesmente iterava sobre cada arquivo no diretório e executava meu comando, enquanto fazia algum tipo de técnica de contagem / timer para não sobrecarregar os processadores (assumindo que cada processo tivesse um tempo de execução constante). No entanto, eu sei que nem sempre será o caso, portanto, usar uma solução "paralela" parece a melhor maneira de obter multi-threading de script de shell sem escrever código personalizado.
Embora tenha pensado em algumas maneiras de criar paralelos para processar cada um desses arquivos (e me permitir gerenciar meus núcleos com eficiência), todos eles parecem hacky. Eu tenho o que eu acho que é um caso de uso bastante fácil, por isso preferiria mantê-lo o mais limpo possível (e nada nos exemplos paralelos parece pular 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
Roteiro:
> cat proces_script.sh
#!/bin/sh
customScript -c 33 -I -file [inputFile] -a -v 55 > [outputFile]
Atualização : Depois de ler a resposta de Ole abaixo, pude reunir as peças que faltavam para minha própria implementação paralela. Embora sua resposta seja ótima, aqui está minha pesquisa adicional e as anotações que fiz:
Em vez de executar todo o meu processo, imaginei começar com um comando de prova de conceito para provar sua solução no meu ambiente. Veja minhas duas implementações diferentes (e notas):
find /home/me/input_files -type f -name *.txt | parallel cat /home/me/input_files/{} '>' /home/me/output_files/{.}.out
Utiliza find (não ls, que pode causar problemas) para encontrar todos os arquivos aplicáveis no diretório de arquivos de entrada e, em seguida, redireciona seu conteúdo para um diretório e arquivo separados. Meu problema acima foi a leitura e o redirecionamento (o script real era simples), portanto, substituir o script por cat foi uma boa prova de conceito.
parallel cat '>' /home/me/output_files/{.}.out ::: /home/me/input_files/*
Esta segunda solução usa o paradigma da variável de entrada paralela para ler os arquivos; no entanto, para um iniciante, isso era muito mais confuso. Para mim, usar find a and pipe atendeu minhas necessidades.