Don't have a Linux machine? Sign up to BitLaunch and use one of our VMs to perform a cURL download.

Though there are a few command-line tools a Linux VPS can utilize to download files, Client URL (cURL) is one of the most used. Its inclusion on most Unix-like operating systems and wide protocol support has made it popular with server admins. This is partly because of its lack of interactivity - when you download a file with cURL it doesn't ask for confirmation and can transfer multiple files at once. This makes it ideal for automation if you trust the source.

Today we'll be walking you through the basics of using curl to download a file. Our sample file will be the readme for blcli, BitLaunch's command-line interface, which is hosted on GitHub.

Fetching a File with cURL

The basic structure of cURL is curl http://yoururl.filename.

curl naturally invokes our command line tool, while the URL points to the location of the remote file you want to download with cURL. In the case of our readme, the complete command would like this:


You'll notice that the contents of the file are displayed in your command line:

blcli is a command-line interface for

  blcli [command]

Available Commands:
  account        Retrieve account information
  create-options View images, sizes, and options available for a host when creating a new server.
  help           Help about any command
  server         Manage your virtual machines
  sshkey         Manage SSH Keys
  transaction    Manage transactions
  version        blcli version

Download a file with cURL

So what if we want to use cURL to save a file to our server? For that, we must use the -O option:

curl -O

You'll notice that cURL will display a download progress table rather than the file contents this time:

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2559  100  2559    0     0  17174      0 --:--:-- --:--:-- --:--:-- 17174

To read verify that the file has downloaded, we can then type nano

If you'd like the file to have a different file name (perhaps readme is too bossy for you), specify it after-O :

curl -o

You should then be able to read the file with sudo nano

Use cURL to download multiple files

That's all well and good, but downloading lots of files in this way would quickly become a hassle. You can download more than one file in a single command by using the following syntax:

curl -O -O

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2559  100  2559    0     0   5067      0 --:--:-- --:--:-- --:--:--  5067
100    23  100    23    0     0    101      0 --:--:-- --:--:-- --:--:--   101

You'll see that this time the output lists two rows for downloads - both of our files.

If both files are in the same sub-directory on the same site, it's even easier:

curl -O -O{,LICENSE.txt}

Or, if you want to download a series of files in the same directory that are numbered:


If you have a long list of different files you want to download, you can place them in a text file and run cURL with xargs:

xargs -n 1 curl -O fileurls.txt

You'll get the normal download output with each file transfer listed in its own row.

Get cURL to follow redirects

As it's common for site admins to move the location of a file, then 301 redirect to the new one, it can be good practice to include the -L option in your cURL command.

For example, if we try to access BitLaunch's robots.txt with this command:

curl -O

You get no output. That's because www.bitlaunch traffic is redirected to https://bitlaunch. If we use curl -L -O, cURL will follow any redirects:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100    23  100    23    0     0     82      0 --:--:-- --:--:-- --:--:--    82

You can see that there are two rows in our download table that didn't download any data. These are the URLs that were redirected. We can review this redirect chain with:

curl -v

*   Trying
* Connected to ( port 80 (#0)
> GET /robots.txt HTTP/1.1
> Host:
> User-Agent: curl/7.58.0
> Accept: */*
< HTTP/1.1 301 Moved Permanently
< Date: Sun, 15 Nov 2020 12:50:43 GMT
< Transfer-Encoding: chunked
< Connection: keep-alive
< Cache-Control: max-age=3600
< Expires: Sun, 15 Nov 2020 13:50:43 GMT
< Location:
< cf-request-id: 066d8e4110000015dc31949000000001
< Server: cloudflare
< CF-RAY: 5f29197b4be815dc-ARN
* Connection #0 to host left intact