Как получить файл с правильным именем при перенаправлении?


117

Поэтому после некоторого времени поиска в Google и Super User (и сканирования справочных страниц) я не смог найти ответ на то, что (я думаю) должно быть простым:

Если вы идете сюда:

http://www.vim.org/scripts/script.php?script_id=2340

И попробуйте скачать тему:

http://www.vim.org/scripts/download_script.php?src_id=9750

Вот так:

wget http://www.vim.org/scripts/download_script.php?src_id=9750

Вы, вероятно, в конечном итоге с файлом под названием download_script.php?src_id=9750.

Но я хочу, чтобы он вызывался molokai.vim, что произойдет, если я воспользуюсь браузером для загрузки этого файла.

Какие параметры мне нужно указать для wget для желаемого эффекта?

Я также согласился бы с эквивалентной командой Curl.

Ответы:


162
-O file
--output-document=file

Документы не будут записаны в соответствующие файлы, но все они будут объединены и записаны в файл. Если -используется в качестве файла, документы будут распечатаны на стандартный вывод, отключив преобразование ссылок. (Используйте ./-для печати в файл с буквальным именем -.)

Так,

wget -O somefile.extension http://www.vim.org/scripts/download_script.php?src_id=9750

Или вы можете решить wgetэту проблему, используя параметр --content-disposition, если это поддерживается вашей версией.

wget --content-disposition http://www.vim.org/scripts/download_script.php?src_id=9750

Предостережения в соответствии с man-страницей,

--content-disposition

Если этот параметр включен, экспериментальная (не полностью функциональная) поддержка заголовков «Content-Disposition» включена. В настоящее время это может привести к дополнительным обращениям к серверу для запроса "HEAD", и, как известно, страдает от нескольких ошибок, поэтому в настоящее время он не включен по умолчанию.

Эта опция полезна для некоторых загружаемых файлов CGI-программ, которые используют заголовки «Content-Disposition» для описания того, каким должно быть имя загружаемого файла.

Вы можете добиться того же автоматического поведения с curlпомощью, используя,

curl -JLO http://www.vim.org/scripts/download_script.php?src_id=9750

-Oиспользует удаленное имя и -Jпринудительно -Oизвлекает это имя из заголовка расположения контента, а не URL, и -Lпри необходимости следует перенаправлениям.


2
Я должен был указать, что это должно быть автоматическим
audio.zoom

Насколько я понимаю, wget использует веб-страницу для правильного информирования, если URL-адрес указывает на файл, и его необходимо сохранить с чем-то другим, используя заголовок размещения контента, который wget может поддерживать или не поддерживать полностью. Так что вы не можете сделать это автоматически с помощью wget. Завивка может иметь более или менее успешный характер в зависимости от веб-страницы.
EightBitTony

смысл в том, чтобы иметь возможность писать эти вещи без сложного разбора, curl - это хорошо, но до сих пор я не смог собрать достойных вариантов для этого
audio.zoom

2
Ага - я не прав, смотрите обновленный ответ. Вот почему сайты stackexchange работают хорошо - все узнают что-то, даже люди, отвечающие на вопросы!
EightBitTony

1
Это сработало для меня для подкаста stackexchange, который некоторое время не давал мне покоя. Благодарю.
Ричард Кэмпбелл

75

С помощью wget вы можете сделать это:

wget --trust-server-names <url> 

сохранить файл, используя последнее имя файла, которое вам предоставит сервер.


2
Интересно , что разница между --trust-server-namesи--content-disposition
JamesTheAwesomeDude

3
Похоже, --trust-server-namesследующие перенаправления в другой файл, и --content-dispositionназывает файл с именем, указанным в заголовке ответа, без необходимости перенаправления.
Асфанд Кази

1
Почему эта функциональность по умолчанию отсутствует?!?!
hopeseekr

8
@hopeseekr Сервер может быть непослушным и вызвать файл .bashrc, если вы не смотрите внимательно. lists.gnu.org/archive/html/bug-wget/2012-04/msg00059.html
Патрик Конхеди

3

Вы также можете использовать aria2c - похоже, он хорошо работает с заголовками Content-Disposition.



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.