function transfer | |
if test (count $argv) -eq 0 | |
echo "No arguments specified. Usage:\necho transfer /tmp/test.md\ncat /tmp/test.md | transfer test.md" | |
return 1 | |
end | |
## get temporarily filename, output is written to this file show progress can be showed | |
set tmpfile ( mktemp -t transferXXX ) | |
## upload stdin or file | |
set file $argv[1] | |
#if tty -s; | |
#then | |
set basefile (basename "$file" | sed -e 's/[^a-zA-Z0-9._-]/-/g') | |
# if [ ! -e $file ]; | |
# then | |
# echo "File $file doesn't exists." | |
# return 1 | |
# fi | |
if test -d $file | |
# zip directory and transfer | |
set zipfile ( mktemp -t transferXXX.zip ) | |
# echo (dirname $file) | |
#cd (dirname $file) and echo (pwd) | |
zip -r -q - $file >> $zipfile | |
curl --progress-bar --upload-file "$zipfile" "https://transfer.sh/$basefile.zip" >> $tmpfile | |
rm -f $zipfile | |
else | |
# transfer file | |
curl --progress-bar --upload-file "$file" "https://transfer.sh/$basefile" >> $tmpfile | |
end | |
#else | |
# # transfer pipe | |
# curl --progress-bar --upload-file "-" "https://transfer.sh/$file" >> $tmpfile | |
#fi | |
## cat output link | |
cat $tmpfile | |
## cleanup | |
rm -f $tmpfile | |
end |
# | |
# Defines transfer alias and provides easy command line file and folder sharing. | |
# | |
# Authors: | |
# Remco Verhoef <remco@dutchcoders.io> | |
# | |
curl --version 2>&1 > /dev/null | |
if [ $? -ne 0 ]; then | |
echo "Could not find curl." | |
return 1 | |
fi | |
transfer() { | |
# check arguments | |
if [ $# -eq 0 ]; | |
then | |
echo "No arguments specified. Usage:\necho transfer /tmp/test.md\ncat /tmp/test.md | transfer test.md" | |
return 1 | |
fi | |
# get temporarily filename, output is written to this file show progress can be showed | |
tmpfile=$( mktemp -t transferXXX ) | |
# upload stdin or file | |
file=$1 | |
if tty -s; | |
then | |
basefile=$(basename "$file" | sed -e 's/[^a-zA-Z0-9._-]/-/g') | |
if [ ! -e $file ]; | |
then | |
echo "File $file doesn't exists." | |
return 1 | |
fi | |
if [ -d $file ]; | |
then | |
# zip directory and transfer | |
zipfile=$( mktemp -t transferXXX.zip ) | |
cd $(dirname $file) && zip -r -q - $(basename $file) >> $zipfile | |
curl --progress-bar --upload-file "$zipfile" "https://transfer.sh/$basefile.zip" >> $tmpfile | |
rm -f $zipfile | |
else | |
# transfer file | |
curl --progress-bar --upload-file "$file" "https://transfer.sh/$basefile" >> $tmpfile | |
fi | |
else | |
# transfer pipe | |
curl --progress-bar --upload-file "-" "https://transfer.sh/$file" >> $tmpfile | |
fi | |
# cat output link | |
cat $tmpfile | |
# cleanup | |
rm -f $tmpfile | |
} | |
Thanks! Updated it to upload folders as well.
This alias function works great with Zsh. Many thanks!
I get the following error on both my RPI2 running Raspbian as well as on my Mac running OS X Yosemite:
bash: ((: !
Seems like it has something to do with the first IF statement so I just removed that (which helped) but still thought you might want to know about this.
$+commands[curl]
is a zsh thing and doesn't work in Bash.
Thx, fixed it.
On Mac OS X Yosemite the bash script will always create a file named 1
.
I beleive line 8 should be:
curl --version 2>&1 > /dev/null
thx, fixed
Thanks for this! Already used here.
Hi, I added a line on the bash version, to copy the link to clipboard...
If I just pipe it without the extra line, it doesn't show on terminal, so DRY suffered a bit.
Awesome product, thanks!
cat $tmpfile | pbcopy
cat $tmpfile
@bitbonsai, nice idea! Remove the newline at the end: cat $tmpfile | tr -d '\n' | pbcopy
Is there a version of.Bat?
Nice. However quotes are missing around $file (4 occurrences).
need to add a "-e" to echo for bash to interpret the newlines "\n".
Also looks like there's a redundant 'echo' in there?
Thank you so much for this service. You are beyond awesome. Wish I found out about it sooner!
Update: You can see my suggestions in my fork: https://gist.github.com/nl5887/a511f172d3fb3cd0e42d
I am using an older version of this alias. I tried to upload a file which its name contained brackets. I got an error because brackets have some special meaning for curl
, apparently. So I suggest calling curl
with -g
switch to make it treat brackets in filenames as normal characters.
Any idea why I get:
syntax error near unexpected token 'filename'
After adding the alias and trying to call it with any parameter?
why not add transfer $1
at the end so its self executing and one can just add the file somewhere on the PATH
?
Hello! How can one properly modify this shell script to add GPG encryption functionality ? It would be really nice to have this as an option.
$ transfer "Name With Spaces.txt"
result in
basename: extra operand 'Spaces.txt'
Try 'basename --help' for more information.
on the website's version, the gist works well ;D
Agreeing with @tallinn-code, it could be great to implement a .trshrc file ;D
There are several double quotes missing, plus other mistakes as in usage.
Here's the correct (bash) code:
transfer() {
# check arguments
if [ $# -ne 1 ];
then
echo -e "Wrong arguments specified. Usage:\ntransfer /tmp/test.md\ncat /tmp/test.md | transfer test.md"
return 1
fi
# get temporary filename, output is written to this file so show progress can be showed
tmpfile="$( mktemp -t transferXXX )"
# upload stdin or file
file="$1"
if tty -s;
then
basefile="$( basename "$file" | sed -e 's/[^a-zA-Z0-9._-]/-/g' )"
if [ ! -e $file ];
then
echo "File $file doesn't exists."
return 1
fi
if [ -d $file ];
then
# zip directory and transfer
zipfile="$( mktemp -t transferXXX.zip )"
cd "$(dirname "$file")" && zip -r -q - "$(basename "$file")" >> "$zipfile"
curl --progress-bar --upload-file "$zipfile" "https://transfer.sh/$basefile.zip" >> "$tmpfile"
rm -f $zipfile
else
# transfer file
curl --progress-bar --upload-file "$file" "https://transfer.sh/$basefile" >> "$tmpfile"
fi
else
# transfer pipe
curl --progress-bar --upload-file "-" "https://transfer.sh/$file" >> "$tmpfile"
fi
# cat output link
cat "$tmpfile"
echo
# cleanup
rm -f "$tmpfile"
}
Thanks @HacKanCuBa ! Had the same problem.
Please consider pulling in my change:
https://gist.github.com/PetrusKiendys/a7775e674d2eb58d7f9a10e767befe0e/revisions?diff=unified
(currently no way to do a PR on gists.. :( )
Consider replacing the fish version with a link to https://github.com/fisherman/transfer
Yeah, this should be a real repo, for PR's.
Please, always use http://shellcheck.net/ on shell scripts.
You can get it immediately in vim on Ubuntu/Debian with sudo apt install shellcheck vim-syntastic
, also supported in lots of other editors, or just paste your script into the web site.
I added the following after '# cat output link' and before '# cleanup' to keep track of hem:
# log file link
APPLICATION="${0##*/}"
RIGHTNOW="$(date)"
EXPIRES="$(date -d "+14 days")"
echo -e "$(cat "$tmpfile") - uploaded $RIGHTNOW - expires $EXPIRES\n" >> ~/$APPLICATION.log
echo "See ~/$APPLICATION.log for all transfers."
~Denny
solution without temp files
transfer() {
# check arguments
if [ $# -eq 0 ]; then
echo "No arguments specified." >&2
echo "Usage:" >&2
echo " transfer <file|directory>" >&2
echo " ... | transfer <file_name>" >&2
return 1
fi
# upload stdin or file
if tty -s; then
file="$1"
if [ ! -e "$file" ]; then
echo "$file: No such file or directory" >&2
return 1
fi
file_name=$(basename "$file" | sed -e 's/[^a-zA-Z0-9._-]/-/g')
# upload file or directory
if [ -d "$file" ]; then
# transfer directory
file_name="$file_name.zip"
(cd "$file" && zip -r -q - .) | curl --progress-bar --upload-file "-" "https://transfer.sh/$file_name" | tee /dev/null
else
# transfer file
cat "$file" | curl --progress-bar --upload-file "-" "https://transfer.sh/$file_name" | tee /dev/null
fi
else
# transfer pipe
file_name=$1
curl --progress-bar --upload-file "-" "https://transfer.sh/$file_name" | tee /dev/null
fi
}
@qoomon
Both code from transfer.sh and your code return a link with a %
at the end, making the link fail to open when opened by just click the link in Terminal output. I have to manually remove the %
from address after pasted in address bar in a browser.
I am using zsh and add the function in ~/.zshrc
. What could be the reason?
not working on bash for me from alpine or ubuntu 18.04. why?
Thank you so much for taking the time to lay this out as clearly as possible. This functionality is awesome, and I definitely look forward to using it on a day-to-day basis!