Executar comandos curl em paralelo usando xargs com entradas do csv

2

Eu tenho um arquivo csv com várias colunas, incluindo um número de sequência e um URL de imagem. O arquivo tem mais de 450 linhas.

1,text1,text2,http://image_a.jpg
2,text1,text2,http://image_b.jpg
3,text1,text2,http://image_c.jpg
.
.
.

O objetivo é fazer o download da imagem na URL com um nome de arquivo sendo a sequência. Eu consegui isso com sucesso com o seguinte script

while IFS=, read col1 col2 col3 col4
do
   curl ${col4} > ${col1}.jpg
done < myfile.csv

Agora, quero executar os comandos curl em paralelo usando xargs -P . (Eu não quero apenas fundo usando & como eu quero limitar o número de processos). Eu vejo exemplos usando -I e -R , mas não consigo descobrir como usar vários campos de uma linha do csv arquivo no comando xargs.

Eu percebo que o gnu parallel e o wget podem ser opções melhores, mas eles não estão disponíveis no meu ambiente unix.

Obrigado.

    
por Scott Nelson 01.11.2018 / 22:14

2 respostas

1

Parece-me que você teria que criar os comandos curl e depois passá-los para xargs:

awk -F, '{print "curl '\''" $4 "'\'' > '\''" $1".jpg'\''"}' < input.csv | xargs -P2 -I {} sh -c '{}'

O comando parece um pouco feio porque eu coloquei aspas simples em torno do URL e do número de seqüência / nomes de arquivos, caso haja algum caractere especial de shell neles (por exemplo, & ).

    
por 02.11.2018 / 02:28
0

Se Scott pode usar uma das formas propostas para obter o Paralelo GNU link , então isso pode funcionar:

parallel --colsep , 'curl {4} > {1}.jpg' :::: input.csv
    
por 02.11.2018 / 08:44

Tags