Expand
+
```bash
transfer()
{
- local file="${1}"
- local filename="${file##*/}"
- # show delete link from the response header after upload. the command "sed" is necessary to clean up the output, "gsub()" in "awk" does not work.
- curl --request PUT --progress-bar --dump-header - --upload-file "${file}" "https://transfer.sh/${filename}" | sed "s/#//g" | awk '/x-url-delete/ { print "Delete command: curl --request DELETE " $2 } END{ print "Download link: " $1 }'
+ local file
+ declare -a file_array
+ file_array=("${@}")
+
+ if [[ "${file_array[@]}" == "" || "${1}" == "--help" || "${1}" == "-h" ]]
+ then
+ echo "${0} - Upload arbitrary files to \"transfer.sh\"."
+ echo ""
+ echo "Usage: ${0} [options] []..."
+ echo ""
+ echo "OPTIONS:"
+ echo " -h, --help"
+ echo " show this message"
+ echo ""
+ echo "EXAMPLES:"
+ echo " Upload a single file from the current working directory:"
+ echo " ${0} \"image.img\""
+ echo ""
+ echo " Upload multiple files from the current working directory:"
+ echo " ${0} \"image.img\" \"image2.img\""
+ echo ""
+ echo " Upload a file from a different directory:"
+ echo " ${0} \"/tmp/some_file\""
+ echo ""
+ echo " Upload all files from the current working directory. Be aware of the webserver's rate limiting!:"
+ echo " ${0} *"
+ echo ""
+ echo " Upload a single file from the current working directory and filter out the delete token and download link:"
+ echo " ${0} \"image.img\" | awk --field-separator=\": \" '/Delete token:/ { print \$2 } /Download link:/ { print \$2 }'"
+ echo ""
+ echo " Show help text from \"transfer.sh\":"
+ echo " curl --request GET \"https://transfer.sh\""
+ return 0
+ else
+ for file in "${file_array[@]}"
+ do
+ if [[ ! -f "${file}" ]]
+ then
+ echo -e "\e[01;31m'${file}' could not be found or is not a file.\e[0m" >&2
+ return 1
+ fi
+ done
+ unset file
+ fi
+
+ local upload_files
+ local curl_output
+ local awk_output
+ local filename
+
+ du --total --block-size="K" --dereference "${file_array[@]}" >&2
+ # be compatible with "bash"
+ if [[ "${ZSH_NAME}" == "zsh" ]]
+ then
+ read $'upload_files?\e[01;31mDo you really want to upload the above files ('"${#file_array[@]}"$') to "transfer.sh"? (Y/n): \e[0m'
+ elif [[ "${BASH}" == *"bash"* ]]
+ then
+ read -p $'\e[01;31mDo you really want to upload the above files ('"${#file_array[@]}"$') to "transfer.sh"? (Y/n): \e[0m' upload_files
+ fi
+
+ case "${upload_files:-y}" in
+ "y"|"Y")
+ # for the sake of the progress bar, execute "curl" for each file.
+ # the parameters "--include" and "--form" will suppress the progress bar.
+ for file in "${file_array[@]}"
+ do
+ filename="${file##*/}"
+ # show delete link and filter out the delete token from the response header after upload.
+ # it is important to save "curl's" "stdout" via a subshell to a variable or redirect it to another command,
+ # which just redirects to "stdout" in order to have a sane output afterwards.
+ # the progress bar is redirected to "stderr" and is only displayed,
+ # if "stdout" is redirected to something; e.g. ">/dev/null", "tee /dev/null" or "| ".
+ # the response header is redirected to "stdout", so redirecting "stdout" to "/dev/null" does not make any sense.
+ # redirecting "curl's" "stderr" to "stdout" ("2>&1") will suppress the progress bar.
+ curl_output=$(curl --request PUT --progress-bar --dump-header - --upload-file "${file}" "https://transfer.sh/${filename}")
+ awk_output=$(awk \
+ 'gsub("\r", "", $0) && tolower($1) ~ /x-url-delete/ \
+ {
+ delete_link=$2;
+ print "Delete command: curl --request DELETE " "\""delete_link"\"";
+
+ gsub(".*/", "", delete_link);
+ delete_token=delete_link;
+ print "Delete token: " delete_token;
+ }
+
+ END{
+ print "Download link: " $0;
+ }' <<< "${curl_output}")
+
+ # return the results via "stdout", "awk" does not do this for some reason.
+ echo -e "${awk_output}\n"
+
+ # avoid rate limiting as much as possible; nginx: too many requests.
+ if (( ${#file_array[@]} > 4 ))
+ then
+ sleep 5
+ fi
+ done
+ ;;
+
+ "n"|"N")
+ return 1
+ ;;
+
+ *)
+ echo -e "\e[01;31mWrong input: '${upload_files}'.\e[0m" >&2
+ return 1
+ esac
}
```
-#### Sample ouput
-```bash
-$ transfer image.img
-######################################################################################################################################################################################################################################## 100.0%
-Delete command: curl --request DELETE https://transfer.sh/Ge9cuW/image.img/
-Download link: https://transfer.sh/Ge9cuW/image.img
-```
+
+#### Sample output
+```bash
+$ ls -lh
+total 20M
+-rw-r--r-- 1