How to wget a file with correct name when redirected?

120

38

So after some time of searching on Google and Super User (and scanning man pages) I was unable to find an answer to something that (I think) should be simple:

If you go here:

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

And try to download the theme:

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

Like so:

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

You’ll probably end up with a file called download_script.php?src_id=9750.

But I want it to be called molokai.vim, which is what would happen if I used a browser to download this file.

What options do I need to specify for wget for the desired effect?

I'd also be ok with a Curl equivalent command.

audio.zoom

Posted 2011-06-23T11:44:50.767

Reputation: 1 413

Answers

166

-O file
--output-document=file

The documents will not be written to the appropriate files, but all will be concatenated together and written to file. If - is used as file, documents will be printed to standard output, disabling link conversion. (Use ./- to print to a file literally named -.)

So,

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

Or you may be able to get wget to work this out using the --content-disposition option if supported by your version.

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

Caveats as per the man page,

--content-disposition

If this is set to on, experimental (not fully-functional) support for "Content-Disposition" headers is enabled. This can currently result in extra round-trips to the server for a "HEAD" request, and is known to suffer from a few bugs, which is why it is not currently enabled by default.

This option is useful for some file-downloading CGI programs that use "Content-Disposition" headers to describe what the name of a downloaded file should be.

You can achieve the same automated behaviour with curl, using,

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

-O uses the remote name, and -J forces the -O to get that name from the content-disposition header rather than the URL, and -L follows redirects if needed.

EightBitTony

Posted 2011-06-23T11:44:50.767

Reputation: 3 741

2I should've specified that this needs to be automatic – audio.zoom – 2011-06-23T12:05:31.483

As I understand it, wget relies on the web page to correctly inform it if the URL points to a file and it needs to be saved with something different, using the content disposition header, which wget may or may not fully support. So you can't do it automagically with wget. Curl may have more or less success depending on the web page. – EightBitTony – 2011-06-23T12:08:12.150

the point is to be able to script these things without complicated parsing, curl is fine but so far i haven't been able to collect decent options for that either – audio.zoom – 2011-06-23T12:14:40.477

So, running wget -S you can see the page does return a content disposition entry, Content-Disposition: attachment; filename=molokai.vim, which suggests it's not fixable. wget just isn't coping. – EightBitTony – 2011-06-23T12:19:09.393

2Aha - I'm wrong, see updated answer. This is why stackexchange sites work well - everyone learns something, even people answering the questions! – EightBitTony – 2011-06-23T12:20:35.383

Nice one - easy tools are the best – audio.zoom – 2011-06-23T12:26:39.373

Added the curl parameters that make curl work too. – EightBitTony – 2011-06-23T12:46:07.483

1This worked for me for the stackexchange podcast, which had been bugging me for a while. Thanks. – Richard Campbell – 2011-10-05T20:41:30.750

79

With wget you can do this:

wget --trust-server-names <url> 

to save the file using the last file name the server gives you.

Thi Duong Nguyen

Posted 2011-06-23T11:44:50.767

Reputation: 913

2I wonder what the difference is between --trust-server-names and --content-disposition – JamesTheAwesomeDude – 2015-06-10T15:43:29.597

3Looks like --trust-server-names follows redirects to a different file, and --content-disposition names the file with the name specified in the response header without any redirecting required. – Asfand Qazi – 2015-07-06T10:26:57.863

1Why isn't this default functionality?!?! – hopeseekr – 2016-05-08T17:16:02.947

8

@hopeseekr The server might be naughty and call the file .bashrc if you are not watching carefully. https://lists.gnu.org/archive/html/bug-wget/2012-04/msg00059.html

– Patrick Conheady – 2016-10-26T23:46:56.370

3

You could also use aria2c - it seems to work nicely with the Content-Disposition headers.

dkam

Posted 2011-06-23T11:44:50.767

Reputation: 241

1

Worked by following:

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

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

(changed case to smaller i.e. (the wget -O) to (wget -o)

Zahid Hussain

Posted 2011-06-23T11:44:50.767

Reputation: 11

0

Just fyi curl redirects well, so using the following should work, I think, for what you are looking for.

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

Dan M.

Posted 2011-06-23T11:44:50.767

Reputation: 1 676