Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Bash and zsh alias for transfer.sh. Transfers files and directories to transfer.sh.
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
}
@Mike-T-Mitchell

This comment has been minimized.

Copy link

Mike-T-Mitchell commented Dec 5, 2014

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!

@nl5887

This comment has been minimized.

Copy link
Owner Author

nl5887 commented Dec 18, 2014

Thanks! Updated it to upload folders as well.

@orschiro

This comment has been minimized.

Copy link

orschiro commented Jan 5, 2015

This alias function works great with Zsh. Many thanks!

@Nygaardc

This comment has been minimized.

Copy link

Nygaardc commented May 23, 2015

I get the following error on both my RPI2 running Raspbian as well as on my Mac running OS X Yosemite:
bash: ((: ! $+commands[curl] : syntax error: operand expected (error token is "$+commands[curl] ").
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.

@kyrias

This comment has been minimized.

Copy link

kyrias commented Jun 17, 2015

$+commands[curl] is a zsh thing and doesn't work in Bash.

@nl5887

This comment has been minimized.

Copy link
Owner Author

nl5887 commented Jul 18, 2015

Thx, fixed it.

@jozsi

This comment has been minimized.

Copy link

jozsi commented Aug 3, 2015

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
@nl5887

This comment has been minimized.

Copy link
Owner Author

nl5887 commented Oct 19, 2015

thx, fixed

@GochoMugo

This comment has been minimized.

Copy link

GochoMugo commented Nov 6, 2015

Thanks for this! Already used here.

@bitbonsai

This comment has been minimized.

Copy link

bitbonsai commented Apr 2, 2016

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
@rockymadden

This comment has been minimized.

Copy link

rockymadden commented Apr 12, 2016

@bitbonsai, nice idea! Remove the newline at the end: cat $tmpfile | tr -d '\n' | pbcopy

@s3y

This comment has been minimized.

Copy link

s3y commented May 19, 2016

Is there a version of.Bat?

@priezz

This comment has been minimized.

Copy link

priezz commented Aug 11, 2016

Nice. However quotes are missing around $file (4 occurrences).

@jyoo

This comment has been minimized.

Copy link

jyoo commented Aug 31, 2016

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

@melmi

This comment has been minimized.

Copy link

melmi commented Oct 1, 2016

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.

@cheson

This comment has been minimized.

Copy link

cheson commented Mar 6, 2017

Any idea why I get:

syntax error near unexpected token 'filename'

After adding the alias and trying to call it with any parameter?

@ysndr

This comment has been minimized.

Copy link

ysndr commented Apr 2, 2017

why not add transfer $1 at the end so its self executing and one can just add the file somewhere on the PATH?

@solus-hq

This comment has been minimized.

Copy link

solus-hq commented May 9, 2017

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.

@Nurrl

This comment has been minimized.

Copy link

Nurrl commented May 11, 2017

$ 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

@Nurrl

This comment has been minimized.

Copy link

Nurrl commented May 11, 2017

Agreeing with @tallinn-code, it could be great to implement a .trshrc file ;D

@HacKanCuBa

This comment has been minimized.

Copy link

HacKanCuBa commented May 13, 2017

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"
}
@xenefix

This comment has been minimized.

Copy link

xenefix commented May 15, 2017

Thanks @HacKanCuBa ! Had the same problem.

@PetrusKiendys

This comment has been minimized.

Copy link

PetrusKiendys commented Sep 26, 2017

Please consider pulling in my change:
https://gist.github.com/PetrusKiendys/a7775e674d2eb58d7f9a10e767befe0e/revisions?diff=unified

(currently no way to do a PR on gists.. :( )

@xendk

This comment has been minimized.

Copy link

xendk commented Jan 29, 2018

Consider replacing the fish version with a link to https://github.com/fisherman/transfer

@unhammer

This comment has been minimized.

Copy link

unhammer commented Feb 16, 2018

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.

@DennisLfromGA

This comment has been minimized.

Copy link

DennisLfromGA commented Mar 30, 2018

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

@qoomon

This comment has been minimized.

Copy link

qoomon commented Jun 24, 2018

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
}
@JackieMium

This comment has been minimized.

Copy link

JackieMium commented Aug 22, 2018

@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?

@tigefa4u

This comment has been minimized.

Copy link

tigefa4u commented Aug 27, 2018

not working on bash for me from alpine or ubuntu 18.04. why? 😕

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.