140

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.

190
-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.

10
  • 2
    I should've specified that this needs to be automatic
    – audio.zoom
    Jun 23 '11 at 12:05
  • 2
    Aha - I'm wrong, see updated answer. This is why stackexchange sites work well - everyone learns something, even people answering the questions! Jun 23 '11 at 12:20
  • 1
    Added the curl parameters that make curl work too. Jun 23 '11 at 12:46
  • 1
    This worked for me for the stackexchange podcast, which had been bugging me for a while. Thanks. Oct 5 '11 at 20:41
  • 1
    --content-disposition worked well (at least it appears to be downloading the correct file as I type this), whereas curl -JLO did not do the trick. I'm new to using both tools, so I wonder why the disparity. Feb 9 '21 at 17:27
89

With wget you can do this:

wget --trust-server-names <url> 

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

6
  • 5
    I wonder what the difference is between --trust-server-names and --content-disposition Jun 10 '15 at 15:43
  • 4
    Looks 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. Jul 6 '15 at 10:26
  • 3
    Why isn't this default functionality?!?!
    – hopeseekr
    May 8 '16 at 17:16
  • 13
    @hopeseekr The server might be naughty and call the file .bashrc if you are not watching carefully. lists.gnu.org/archive/html/bug-wget/2012-04/msg00059.html Oct 26 '16 at 23:46
  • So helpful. I was downloading something and its name was download without any extestion. So bothering. Sep 25 '20 at 3:09
5

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

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)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.