#!/bin/bash
########################################################################
#Задача: взяв файл формата - каждая новая строка, новый файл для закачки, задав параметры wget
#(они будут одинаковые для всех закачек), получить автоматизацию процесса скачивания,
#с логированием ошибок, и сохранением лога закачек, для дальнейшего просмотра.
#Для запуска необходимо указать в качестве параметра файл со списком закачек (или настроить по умолчанию -
#см. строку 22), задать путь для лог файла (строка 12), файла ошибок (строка 14) и
#параметры командной строки wget (строка 17). `Суб 19 Июн 00:00`
########################################################################
#Задаем имя файла - лога процесса закачки. Путь свой подставить.
wget_log="/home/user/wget/load.log"
#Задаем имя файла - лога ошибок закачки.
wget_error="/home/wget/load.error"
#Параметры wget, логирование сюда не ставить, см. 3 строчки выше, остальное по вкусу...
#кстати, --directory-prefix=/каталог/куда/сохранять/
wget_param="-t8 -w1"
#Если, не передано имя файла с адресами в качестве аргумента скрипта, принимаем стандартное имя файла.
if [ -z "$1" ] ; then
#--------------------------------------------
Filename="/home/wget/load.txt" #Путь к файлу закачек свой подставить.
#--------------------------------------------
else
Filename=$1
fi
#Создаем и очищаем вспомогательный файл закачек, см. далее. (последние строки цикла until)
touch $Filename.tmp
: >$Filename.tmp
#Создаем файл ошибок закачек, если уже есть, то просто обновится дата модификации файла.
touch $wget_error
#Количество строк в переданном файле
Str_num=`cat $Filename |wc -l`
until [ $Str_num -eq 0 ] # Пока $Str_num (количество строк) не станет равным 0
do
# Чтение будет из $Filename, а не со stdin, см. конец цикла.
#Переменная Name будет последовательно, по мере прохождения цикла, равно очередной строчке $Filename
read Name
#Подставляем свои параметры закачки. Параметр wget -o (логирование, НЕ убирать). Имя файла уникальное

#$wget_param - опции закачки, $Name - имя файля для закачки, извлекается из строки файла закачек.
#--------------------------------------------
wget $wget_param $Name -o /tmp/wget_bla_bla.tmp
#--------------------------------------------
#Добавляем лог текущей закачки в лог файл.
Getfilelog=`cat /tmp/wget_bla_bla.tmp`
#--------------------------------------------
#Вставляем пустые строки
echo "">>$wget_log
#Имя лога задается выше.
echo "$Getfilelog">>$wget_log
echo "">>$wget_log
#--------------------------------------------
#Если лог содержит строку "Файл уже получен ...", значит он уже БЫЛ закачан.
If_file1=`grep "Файл уже получен" /tmp/wget_bla_bla.tmp`
#Если лог содержит строку "saved [", значит он успешно закачан. (вывод типа «index.html» saved [6071/6071])
If_file2=`grep "saved \[" /tmp/wget_bla_bla.tmp`
#Если переменные $If_file(1 или 2) не пустые, файл был по какой то причине не был закачен.
#Создаем файл ошибок закачки, он будет лежать рядом с файлом закачек.
#Если wget при обработке строки закачки не написал, что "Файл уже получен" или сохранен, то добавляем
#эту строку в файл ошибок закачки. Его можно потом вручную прогнать.
if [ -n "$If_file1" ] ; then sleep 1 ; else
if [ -n "$If_file2" ] ; then sleep 1 ; else echo "`date +%D--%R` $Name">>$wget_error ; fi ; fi
#Перезаписываем исходный файл закачек, только убираем из него первую строку, т.е. ту строку
#которую мы уже передали на обработку wget, она нам больше не нужна.
New_str_num=`cat $Filename |wc -l`
let "New_str_num -=1"
tail -n$New_str_num $Filename > $Filename.tmp
mv -f $Filename.tmp $Filename
#Пересчитываем заново количество строк в файле закачек, нужно, чтоб прекратить цикл (при = 0)
Str_num=`cat $Filename |wc -l`
done <"$Filename" # Перенаправление на ввод цикла по одной строке из файла $Filename.
#Удаляем временны файл.
rm /tmp/wget_bla_bla.tmp
exit 0