Many organizations and colleges restrict their employees and students respectively from downloading files from the Internet which are larger than a prescribed limit. It is way too low at 14MB where I work. Fret not! There are ways to bypass this. And here is a simple bash script I wrote to download much larger files at my workplace.
Note: This script works only with direct links and with servers which support resume-download functionality.
I'm continually working on it. So, the latest version will be available on my github account.
How to run it?
Note: This script works only with direct links and with servers which support resume-download functionality.
I'm continually working on it. So, the latest version will be available on my github account.
How to run it?
- Download the following code to a text file named curldownload.sh
- Give executable permissions to it chmod +x curldownload.sh
- File size limit, fsize_limit variable, is set to 14MB. You may change it to your liking.
- The script takes two arguments; the first one being the url of the file to be downloaded; the second one which is optional (defaults to "./") is the output directory.
- For ex:- ./curldownload.sh http://ftp.jaist.ac.jp/pub/mozilla.org/firefox/releases/12.0/linux-i686/en-US/firefox-12.0.tar.bz2 "$HOME/Downloads"
- A little more complex example of it using multiple urls, and two command-line arguments (-d for output directory, and -u for user-agent http header) is: ./curl-multi-url.sh -d ~/downloads/ -u "Chromium/18.0" http://ftp.jaist.ac.jp/pub/mozilla.org/firefox/releases/11.0/linux-x86_64/en-US/firefox-11.0.tar.bz2 http://ftp.jaist.ac.jp/pub/mozilla.org/firefox/releases/12.0/linux-i686/en-US/firefox-12.0.tar.bz2
#!/bin/bash
#
# Vikas Reddy @
# http://vikas-reddy.blogspot.in/2012/04/bypass-proxy-servers-file-size-download.html
#
#
# Usage:
# ./curl-multi-url.sh -d OUTPUT_DIRECTORY -u USER_AGENT http://url-1/ http://url-2/;
# Arguments -d and -u are optional
#
#
# Defaults
fsize_limit=$((14*1024*1024))
user_agent="Firefox/10.0"
output_dir="."
# Command-line options
while getopts 'd:u:' opt "$@"; do
case "$opt" in
d) output_dir="$OPTARG";;
u) user_agent="$OPTARG";;
esac
done
shift $((OPTIND - 1))
# output directory check
if [ -d "$output_dir" ]; then
echo "Downloading all files to '$output_dir'"
else
echo "Target directory '$output_dir' doesn't exist. Aborting..."
exit 1
fi;
for url in "$@"; do
filename="$(echo "$url" | sed -r 's|^.*/([^/]+)$|\1|')"
filepath="$output_dir/$filename"
# Avoid overwriting the file
if [[ -f "$filepath" ]]; then
echo -n "'$filepath' already exists. Do you want to overwrite it? [y/n] "; read response
[ -z "$(echo "$response" | grep -i "^y")" ] && continue
else
cat /dev/null > "$filepath"
fi
echo -e "\nDownload of $url started..."
i=1
while true; do # infinite loop, until the file is fully downloaded
# setting the range
[ $i -eq 1 ] && start=0 || start=$(( $fsize_limit * ($i - 1) + 1))
stop=$(( $fsize_limit * i ))
# downloading
curl --fail --location --user-agent "$user_agent" --range "$start"-"$stop" "$url" >> "$filepath"
exit_status="$?"
# download finished
[ $exit_status -eq 22 ] && echo -e "Saved $filepath\n" && break
# other exceptions
[ $exit_status -gt 0 ] && echo -e "Unknown exit status: $exit_status. Aborting...\n" && break
i=$(($i + 1))
done
]]>