Wget - огляд цікавих фіч і глюків

Дуже часто приходиться щось викачувати з інтернету. Утиліта 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 зберігає їх у якомусь дивному форматі. Або взагалі не зберігає і вилітає з фатальною помилкою.

Для прикладу, якщо у нас уркла такого типу http://brb.to/get/dl/8ozpsp1a56k4rk698uisue5vt/01_%D0%AF+%D1%82%D0%B0%D0%BA+%D1%85%D0%BE%D1%87%D1%83.mp3 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 наздвичайно великі, це тільки початок

Коментарів: (1)

  1. анонім
    анонім 2014-09-12 02:02 Відповісти
    Привіт. Простіше використовувати "--restrict-file-names":

    wget --restrict-file-names=nocontrol,windows http://brb.to/get/dl/698j62nxcu2rhhdq3fkjpmurq.0.1139013157.966291011.1410477165/05_%D0%9C%D0%B5%D1%82%D0%B5%D0%BB%D1%8C.mp3