Как использовать wget со списком URL-адресов и соответствующими выходными файлами?

35

Предположим, list_of_urlsвыглядит так:

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

Я знаю, как использовать это с:

wget -i list_of_urls

Но что если у my 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(также, я предполагаю, что это файл на вашем диске).

rahmu
источник
Вот вариант этого: создайте небольшой скрипт с одной строкой wget -O $2 $1. В файле list_of_urls сделайте каждую строку URL, пробелом, именем файла (например,http://url1/blah&blah=whatever some.pdf затем используйте то же, что и выше, заменив строку wget на ./thatscript.sh $url. В этом случае, $urlна самом деле, это строка с URL и именем файла, конечно.
goldilocks
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включает рекурсивную загрузку. Имена файлов установлены неправильно.
Джофель