Create a gist now

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
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment