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.

Show comment
Hide comment
@Mike-T-Mitchell

Mike-T-Mitchell 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!

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.

Show comment
Hide comment
@nl5887

nl5887 Dec 18, 2014

Thanks! Updated it to upload folders as well.

Owner

nl5887 commented Dec 18, 2014

Thanks! Updated it to upload folders as well.

@orschiro

This comment has been minimized.

Show comment
Hide comment
@orschiro

orschiro Jan 5, 2015

This alias function works great with Zsh. Many thanks!

orschiro commented Jan 5, 2015

This alias function works great with Zsh. Many thanks!

@Nygaardc

This comment has been minimized.

Show comment
Hide comment
@Nygaardc

Nygaardc 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.

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.

Show comment
Hide comment
@kyrias

kyrias Jun 17, 2015

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

kyrias commented Jun 17, 2015

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

@nl5887

This comment has been minimized.

Show comment
Hide comment
@nl5887

nl5887 Jul 18, 2015

Thx, fixed it.

Owner

nl5887 commented Jul 18, 2015

Thx, fixed it.

@jozsi

This comment has been minimized.

Show comment
Hide comment
@jozsi

jozsi 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

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.

Show comment
Hide comment
@nl5887

nl5887 Oct 19, 2015

thx, fixed

Owner

nl5887 commented Oct 19, 2015

thx, fixed

@GochoMugo

This comment has been minimized.

Show comment
Hide comment
@GochoMugo

GochoMugo Nov 6, 2015

Thanks for this! Already used here.

GochoMugo commented Nov 6, 2015

Thanks for this! Already used here.

@bitbonsai

This comment has been minimized.

Show comment
Hide comment
@bitbonsai

bitbonsai 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

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.

Show comment
Hide comment
@rockymadden

rockymadden Apr 12, 2016

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

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.

Show comment
Hide comment
@s3y

s3y May 19, 2016

Is there a version of.Bat?

s3y commented May 19, 2016

Is there a version of.Bat?

@priezz

This comment has been minimized.

Show comment
Hide comment
@priezz

priezz Aug 11, 2016

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

priezz commented Aug 11, 2016

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

@jyoo

This comment has been minimized.

Show comment
Hide comment
@jyoo

jyoo 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

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.

Show comment
Hide comment
@melmi

melmi 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.

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.

Show comment
Hide comment
@cheson

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

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.

Show comment
Hide comment
@ysndr

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

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?

@tallinn-code

This comment has been minimized.

Show comment
Hide comment
@tallinn-code

tallinn-code 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.

tallinn-code 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.

Show comment
Hide comment
@Nurrl

Nurrl 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 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.

Show comment
Hide comment
@Nurrl

Nurrl May 11, 2017

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

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.

Show comment
Hide comment
@HacKanCuBa

HacKanCuBa 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"
}

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.

Show comment
Hide comment
@xenefix

xenefix May 15, 2017

Thanks @HacKanCuBa ! Had the same problem.

xenefix commented May 15, 2017

Thanks @HacKanCuBa ! Had the same problem.

@PetrusKiendys

This comment has been minimized.

Show comment
Hide comment
@PetrusKiendys

PetrusKiendys 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.. :( )

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.

Show comment
Hide comment
@xendk

xendk Jan 29, 2018

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

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.

Show comment
Hide comment
@unhammer

unhammer 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.

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.

Show comment
Hide comment
@DennisLfromGA

DennisLfromGA 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

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.

Show comment
Hide comment
@qoomon

qoomon 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
}

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.

Show comment
Hide comment
@JackieMium

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

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.

Show comment
Hide comment
@tigefa4u

tigefa4u Aug 27, 2018

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

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