diff --git a/README.md b/README.md index 44ccb5c..c3a8629 100644 --- a/README.md +++ b/README.md @@ -237,26 +237,157 @@ $ transfer hello.txt ``` -### Zsh (with delete url outpu) -##### Add this to .zshrc or its equivalent +### Bash and zsh (with delete url, delete token output and prompt before uploading) +##### Add this to .bashrc or .zshrc or its equivalent + +
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 10M Apr 4 21:08 image.img +-rw-r--r-- 1 10M Apr 4 21:08 image2.img +$ transfer image* +10240K image2.img +10240K image.img +20480K total +Do you really want to upload the above files (2) to "transfer.sh"? (Y/n): +######################################################################################################################################################################################################################################## 100.0% +Delete command: curl --request DELETE "https://transfer.sh/wJw9pz/image2.img/mSctGx7pYCId" +Delete token: mSctGx7pYCId +Download link: https://transfer.sh/wJw9pz/image2.img + +######################################################################################################################################################################################################################################## 100.0% +Delete command: curl --request DELETE "https://transfer.sh/ljJc5I/image.img/nw7qaoiKUwCU" +Delete token: nw7qaoiKUwCU +Download link: https://transfer.sh/ljJc5I/image.img + +$ transfer "image.img" | awk --field-separator=": " '/Delete token:/ { print $2 } /Download link:/ { print $2 }' +10240K image.img +10240K total +Do you really want to upload the above files (1) to "transfer.sh"? (Y/n): +######################################################################################################################################################################################################################################## 100.0% +tauN5dE3fWJe +https://transfer.sh/MYkuqn/image.img +``` ## Contributions