Один небольшой трюк заключается в использовании относительных номеров строк. Например:
:+0,+99w filename
записывает следующие 100 строк в имя файла .
Вы можете использовать параллели GNU:
parallel --retries 5 -j4 -a file.txt wget {}
Будет выполняться 4 задания одновременно и считываться ввод из file.txt
. В случае сбоя задания оно будет повторено до 20 раз, прежде чем перейти к следующему заданию.
С xargs
, который реализует опцию -P
для поддержки параллельного выполнения нескольких заданий (, наиболее распространенные реализации делают):
xargs -I {} -P 4 wget --quiet {} <file.txt
Делаем это безxargs
или GNU parallel
, но с использованиемbash
:
#!/bin/bash
jobs=0
while read -r url; do
if [ "$jobs" -ge 4 ]; then
wait -n
jobs=$(( jobs - 1 ))
fi
wget --quiet "$url" &
jobs=$(( jobs + 1 ))
done <file.txt
wait
Это запускает wget
фоновые задачи настолько быстро, насколько это возможно, пока не будет запущено четыре таких задания. Затем он ждет, пока любой из них не закончится на wait -n
, прежде чем начать следующий. Переменная jobs
содержит количество текущих wget
заданий.
В конце одиночный вызов wait
будет заблокирован до завершения всех заданий.
Именно wait -n
делает этот скрипт bash
, а не простой /bin/sh
скрипт.
Хотя все ответы с использованием parallel
и xargs
работают нормально, позвольте представить вам GNU Wget2. Это следующая версия Wget, и хотя она все еще находится в альфа-режиме -, она представляет собой замену -для большинства применений Wget.
Wget2 поддерживает многопоточные загрузки, так что вы можете просто передать ему файл и сколько загрузок вы хотите параллельно, пусть Wget2 сделает все остальное за вас.
Источник :Am сопровождающий как для GNU Wget, так и для GNU Wget2