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

Я всегда использовал scp скопировать его:

scp -P 8129 ~/.ssh/id_*.pub user@host:
ssh -p 8129 user@host 'cat id_*.pub >> ~/.ssh/authorized_keys'

Хотя я должен сказать, я буду, вероятно, использовать другие (one-line/connection) методы, если я буду помнить их в будущем. Но это - другая опция для Вас.

35
25.01.2016, 13:30
3 ответа

По умолчанию 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 обычно правильная вещь использовать.

Некоторые серверы используют a 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
33
27.01.2020, 19:36

Вы могли циклично выполниться по записям в Вашем list_of_urls. Что-то вроде этого:

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

Обратите внимание, что необходимо будет добавить собственный способ определить foo для каждой записи list_of_urls (также, я предполагаю, что это - файл на Вашем диске).

2
27.01.2020, 19:36
  • 1
    Вот вариация на это: создайте немного сценария с одной строкой wget -O $2 $1. В list_of_urls файле сделайте каждую строку URL, пробелом, имя файла (например, http://url1/blah&blah=whatever some.pdf. Затем используйте то же как выше, заменяя wget строку ./thatscript.sh $url. В этом случае $url на самом деле строка с URL и именем файла, конечно. –  goldilocks 13.01.2013, 15:17
  • 2
    2: Поместите URL и имена файлов на отдельных, переменных строках в list_of_urls файле, затем используйте while read url; do read filename; wget -O $filename $url; done < list_of_urls. –  goldilocks 13.01.2013, 17:07

Вы можете напрямую использовать WGET вариант:

wget -r -i list_of_urls
2
27.01.2020, 19:36

Теги

Похожие вопросы