Skip to content

Instantly share code, notes, and snippets.

@nl5887
Last active July 30, 2024 09:21
Show Gist options
  • Save nl5887/a511f172d3fb3cd0e42d to your computer and use it in GitHub Desktop.
Save nl5887/a511f172d3fb3cd0e42d to your computer and use it in GitHub Desktop.
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
Copy link

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
Copy link
Author

nl5887 commented Dec 18, 2014

Thanks! Updated it to upload folders as well.

@orschiro
Copy link

orschiro commented Jan 5, 2015

This alias function works great with Zsh. Many thanks!

@c5m
Copy link

c5m 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
Copy link

kyrias commented Jun 17, 2015

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

@nl5887
Copy link
Author

nl5887 commented Jul 18, 2015

Thx, fixed it.

@jozsi
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
Copy link
Author

nl5887 commented Oct 19, 2015

thx, fixed

@GochoMugo
Copy link

Thanks for this! Already used here.

@bitbonsai
Copy link

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
Copy link

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

Copy link

ghost commented May 19, 2016

Is there a version of.Bat?

@priezz
Copy link

priezz commented Aug 11, 2016

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

@empireshades
Copy link

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

@lowlevl
Copy link

lowlevl 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

@lowlevl
Copy link

lowlevl commented May 11, 2017

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

@HacKanCuBa
Copy link

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

@versionsix
Copy link

Thanks @HacKanCuBa ! Had the same problem.

@PetrusKiendys
Copy link

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
Copy link

xendk commented Jan 29, 2018

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

@unhammer
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
Copy link

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
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
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
Copy link

tigefa4u commented Aug 27, 2018

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

@TheYkk
Copy link

TheYkk commented Jul 14, 2019

@JackieMium
add

print " " 

after last fi

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment