Wget – How to Download a File with Correct Name When Redirected

command linecurllinuxredirectionwget

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.

Best Answer

-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 automatically use the filename proposed by the server 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 behavior 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.

Related Question