web-dev-qa-db-fra.com

Téléchargez plusieurs fichiers avec wget en parallèle

J'ai le script Bash suivant:

for i in {0800..9999}; do
    for j in {001..032}; do
        wget http://example.com/"$i-$j".jpg
    done
done

Toutes les photos existent et, en fait, chaque itération ne dépend pas d'un autre. Comment le parallementer avec possibilité de contrôler le nombre de threads?

7
danielleontiev

La réponse de Confiq est une bonne chose pour le petit i et j. Cependant, étant donné la taille de i et j dans votre question, vous voudrez probablement limiter le nombre total de processus engendrés. Vous pouvez le faire avec la commande parallel ou certaines versions de xargs. Par exemple, en utilisant un xargs qui prend en charge le -P Flag Vous pouvez paralliser votre boucle interne comme suit:

for i in {0800..9999}; do
  echo {001..032} | xargs -n 1 -P 8 -I{} wget http://example.com/"$i-{}".jpg
done

GNU parallèle a un grand nombre de fonctionnalités lorsque vous avez besoin de comportement plus sophistiqué et facilite la parallélise sur les deux paramètres:

parallel -a <(seq 0800 9999) -a <(seq 001 032) -P 8 wget http://example.com/{1}-{2}.jpg
21
Steven D
for i in {1..3}; do
    for j in {10..20}; do
        (wget http://example.com/"$i-$j".jpg &)
    done
done

Je l'ai même testé ...

3
confiq

Voici une approche très simpliste. Limite les fils à 10 dans cet exemple.

for i in {0800..9999}; do
    for j in {001..032}; do
        wget http://example.com/"$i-$j".jpg &
        while test $(jobs -p|wc -w) -ge 10; do sleep 0.1 ; done
    done
done
3
steve