Дуже часто приходиться щось викачувати з інтернету. Утиліта wget, як і всі інші тулзи у лінуксі, має надзвичайно багатий функціонал. Одна з важливих штук це викачування файлів по списку.
У цій статті я зроблю короткий огляд функціоналу який використовую + фікс одного цікавого глюку.
Як завантажити файли зі списку за допомогою wget
Якщо виконати команду wget -h
ми побачимо безліч опцій. Ось опис нашої команди:
-i, --input-file=FILE download URLs found in local or external FILE.
У перекладі на українську це значить: завантажити УРЛки із локального або зовнішнього файлу.
Для прикладу у вас є файл serial_season_1.txt
у якому знаходяться посилання на всі серії першого сезону. Що б їх викачати собі на комп’ютер достатньо запустити ось таку команду:
wget --input-file=serial_season_1.txt
Залишилось чекати, в залежності від швидкості вашого Інтернету.
Ще однією з переваг такої штуки це те, що wget
завантажує файли у такому порядку, у якому вони були вказані у файлі. Тобто перші серії прилетять до вас самими першими =)
Дозавантаження файлів
wget розумна тулза і шарить дозавантаження файлів.
Для того що б кожного разу не починати завантаження з 0 необхідно використовувати опцію --continue
.
-c, --continue resume getting a partially-downloaded file.
Наша нова команда буде мати вигляд:
wget --continue --input-file=serial_season_1.txt
Тепер якщо ви зупините завантаження або обірветься інтернет, достатньо запустити команду ще раз і файли докачаються.
Глюк з кирилицею
Все було добре, але якось попався цікавий глюк. Якщо в урл попадаються закодовані символи
у назві файлів, тоді wget
зберігає їх у якомусь дивному форматі. Або взагалі не зберігає і вилітає з фатальною помилкою.
Cannot write to ‘01_Я+\321%82ак+\321%85о\321%87\321%83.mp3’
(Invalid argument).
Я трохи погуглив, і зрозумів в чому прикол. Так як я php програміст і у мене встановлено php на усіх машинах, я і заюзав можливості цієї мови. Ось рішення моєї проблеми:
download-from-file-list(){
cat $1| while read line ; do
input=$(echo $line | php -r "echo trim(urldecode(file_get_contents('php://stdin')));")
output=$(basename "$input");
echo $output;
wget --continue "$input" -O "$output";
done
}
Використовуємо дуже просто:
download-from-file-list serial_season_1.txt
Ось фактично і все. Реальні потужності wget наздвичайно великі, це тільки початок.