diff options
Diffstat (limited to 'Functions/Zftp/zfpcp')
-rw-r--r-- | Functions/Zftp/zfpcp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/Functions/Zftp/zfpcp b/Functions/Zftp/zfpcp new file mode 100644 index 000000000..ddd570e59 --- /dev/null +++ b/Functions/Zftp/zfpcp @@ -0,0 +1,47 @@ +# function zfpcp { +# ZFTP put as copy: i.e. first arguments are remote, last is local. +# Currently only supports +# zfcp lfile rfile +# if there are two arguments, or the second one is . or .., or ends +# with a slash +# or +# zfcp lfile1 lfile2 lfile3 ... rdir +# if there are more than two (because otherwise it doesn't +# know if the last argument is a directory on the remote machine). +# However, if the remote machine plays ball by telling us `Is a directory' +# when we try to copy to a directory, zfpcp will then try to do the correct +# thing. + +emulate -L zsh + +local rem loc +integer stat do_close + +zfautocheck + +if [[ $# -gt 2 || $2 = (.|..) || $2 = */ ]]; then + local dir=$argv[-1] + argv[-1]= + # zfcd directory hack to put the front back to ~ + if [[ $dir = $HOME || $dir = $HOME/* ]]; then + dir="~${dir#$HOME}" + fi + [[ -n $dir && $dir != */ ]] || dir="$dir/" + for loc in $*; do + rem=$dir${loc:t} + zftp put $rem <$loc || stat=1 + done +else + zftp put $2 <$1 + stat=$? + if [[ stat -ne 0 && $ZFTP_CODE = 553 && $ZFTP_REPLY = *'Is a directory'* ]] + then + zftp put $2/$1:t <$1 + stat=$? + fi +fi + +(( $do_close )) && zfclose + +return $stat +# } |