Como podemos usar o curl para baixar vários arquivos simultaneamente? Mesmo se precisarmos gerar vários processos curl, como posso fazer isso na linha de comando ou na função shell? Por exemplo:
$ multiCurl <download 1> <download 2> <download 3>
multiCurl () {
curl <download 1>
curl <download 2>
curl <download 3>
}
ou
for link in $(cat download.list); do
curl <link 1>
curl <link 2>
curl <link 3>
curl <link 4>
done
Responder1
Talvez você possa usar o comando parallel
para baixar vários arquivos simultaneamente.
Aqui presumo que você reserve o nome do arquivo original
#!/usr/bin/env bash
funcDownloadOperation(){
link="${1:-}"
curl -fsSL -O "${link}"
if [[ -s "${link##*/}" ]]; then
echo "file ${link##*/} download successfully!"
else
echo "fail to download link ${link}"
fi
}
export -f funcDownloadOperation
cat download.list | parallel -k -j 0 funcDownloadOperation
Você precisa instalar o utilitário parallel
manualmente em seu sistema Linux.
Responder2
Basta adicionar &
no final de cada comando para que ele seja executado em segundo plano:
curl <link 1>&
Afinal depende se você também deseja saber quando esses comandos terminam e qual é o seu código de retorno. Se sim, você quer tentar algo como:
set -a pids # Array of the process ids of background commands
for url in $whatever_the_list_of_urls
do
curl $url& # start CURL in background
pids[${#pids[*]}]=$! # remember PID
done
# all started, now wait for them
for pid in ${pids[*]}
do
wait $pid
print "Sensed end of $pid, rc:=$?"
done