Многопоточная закачка в командной строке с помощью wget и xargs

При наличии широкого канала бывает выгодно скачать файлы в несколько потоков, это будет быстрее чем качать их по очереди.

Для скачки мы будем использовать wget, а для организации нескольких потоков воспользуемся xargs.

Например у нас имеется файл со списком url, которые нам надо скачать (urllist)

# cat urllist | xargs -t -P 20 -n1 wget 

-P 20 задаёт количество одновременных потоков.

-n1 передаём команде по 1 строке из входного файла, т.е. команда будет запущена для каждой строки исходного файла. 

-t выводит в stdout сформированную команду (в данном случае для отладки).

Работает это так, запускается необходимое количество процессов, ограниченное значением параметра -P, после завершения одного из процессов запускается ещё один, пока не скачаются все файлы из списка.

Немного усложним задачу. У меня есть список файлов, в каталоге веб сервера. Мне надо закачать их в несколько потоков.

# cat filelist | xargs -t -P 20 -n1 -I % wget -q http://example.com/%

Здесь я воспользовался возможностью xargs заменять подстроку на сформированный аргумент, для формирования правильных url из имён файлов.

В итоге получилась многопоточная закачка практически стандартными средствами, которые найдутся в любой *nix системе.