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