Многопоточная закачка в командной строке с помощью 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 системе.