Як я можу використовувати wget зі списком URL-адрес та відповідними ними вихідними файлами?


35

Припустимо, list_of_urlsвиглядає так:

http://www.url1.com/some.txt
http://www.url2.com/video.mp4

Я знаю, як це використовувати з:

wget -i list_of_urls

Але що робити, якщо у мене list_of_urlsце є, і всі вони повертають належні файли, такі як PDF або відео:

http://www.url1.com/app?q=123&gibb=erish&gar=ble
http://www.url2.com/app?q=111&wha=tcha&mac=allit

Для одного файлу я міг би це зробити:

wget -O some.txt "http://www.url1.com/app?q=123&gibb=erish&gar=ble"

Як я можу wgetзавантажити цей список URL-адрес і зберегти повернені дані у відповідний локальний файл?

Відповіді:


33

За замовчуванням wget записує у файл, ім'я якого є останнім компонентом URL-адреси, яку ви передаєте до нього. Багато серверів переспрямовують такі URL-адреси, як http://www.url1.com/app?q=123&gibb=erish&gar=bleна іншу URL-адресу з приємним назвою файлу на зразок http://download.url1.com/files/something.pdf. Ви можете сказати wget використовувати ім’я з перенаправленої URL-адреси (тобто something.pdf) замість того app?q=123&gibb=erish&gar=ble, щоб передавати --trust-server-namesпараметр. Це не режим за замовчуванням, оскільки при необережному використанні це може призвести до заміни непередбачуваного імені файлу в поточному каталозі; але якщо ви довіряєте серверу або працюєте в каталозі, який не містить інших цінних файлів, --trust-server-namesзазвичай це правильне використання.

Деякі сервери використовують Content-Dispositionзаголовок замість перенаправлення, щоб вказати ім'я файлу. Пройдіть --content-dispositionопцію, щоб змусити wget використовувати це ім'я файлу.

Таким чином:

wget --content-disposition --trust-server-names -i list_of_urls

Якщо ви все ще не отримуєте гарних імен файлів, ви можете вказати власні. Припустимо, у вас є файл, що містить на зразок рядків

http://www.url1.com/app?q=123&gibb=erish&gar=ble foo.pdf
http://www.url2.com/app?q=111&wha=tcha&mac=allit bar.txt

Щоб заставити wget завантажувати файли у вказані імена файлів, якщо у URL-адресі чи в іменах файлів немає символів пробілу:

err=0
while read -r url filename tail; do
  wget -O "$filename" "$url" || err=1
done <list_of_urls_and_file_names

errМінлива містить 0 , якщо все завантаження вдалося , і 1 в іншому випадку, ви можете , return $errякщо ви помістіть цей фрагмент коду в функції або exit $errякщо ви помістіть цей фрагмент в рядку.

Якщо ви не хочете вказувати нічого, крім URL-адрес, і не можете отримати приємні імена від сервера, ви можете вгадати тип файлу та спробувати отримати хоча б значущі розширення.

err=0
n=1
while read -r url; do
  if wget -O tmpfile "$url"; then
    ext=data
    case $(file -i tmpfile) in
      application/pdf) ext=pdf;;
      image/jpeg) ext=jpg;;
      text/html) ext=html;;
      text/*) ext=txt;;
    esac
    mv tmpfile "$n.$ext"
  else
    err=1
  fi
  n=$((n+1))
done

Додайте інші види за бажанням. Якщо у вашої fileкоманди немає -mможливості, залиште її і перевірте, що fileповертається у вашій системі для типів файлів, які вас цікавлять. Якщо у вас є файл /etc/mime.typesу вашій системі, ви можете читати асоціації типів MIME з розширеннями з це замість надання власного списку:

n=1
while read -r url; do
  if wget -O tmpfile "$url"; then
    mime_type=$(file -m tmpfile)
    ext=$(awk "$1 == \"$mime_type\" {print \$2; exit} END {print \"data\"}" /etc/mime.types)
    mv tmpfile "$n.$ext"
  else
    err=1
  fi
  n=$((n+1))
done

2

Ви можете перейти на записи у вашому записі list_of_urls. Щось на зразок цього:

while read -r url; do
    wget -O foo $url
done < list_of_urls

Зауважте, що вам доведеться додати свій власний спосіб визначення fooдля кожного запису list_of_urls(також, я припускаю, що це файл на вашому диску).


Ось варіант щодо цього: створіть невеликий сценарій з одним рядком wget -O $2 $1. У файлі list_of_urls, зробити кожен рядок URL, пробіл, ім'я файлу (наприклад , http://url1/blah&blah=whatever some.pdfпотім використовувати ті ж, що і вище, замінивши WGET лінію. ./thatscript.sh $urlУ цьому випадку. $urlНасправді лінія з URL і ім'я файлу, звичайно.
Золотоволоска

2
Варіант 2: Поставте URL-адреси та назви файлів на окремі чергуються рядки у файл list_of_urls, а потім використовуйте while read url; do read filename; wget -O $filename $url; done < list_of_urls.
золотинки

2

Ви можете безпосередньо скористатися wgetопцією:

wget -r -i list_of_urls

Це не працює: -rдозволяє рекурсивне завантаження. Імена файлів встановлені неправильно.
jofel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.