diff options
Diffstat (limited to 'Functions/Zftp/zfgcp')
-rw-r--r-- | Functions/Zftp/zfgcp | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/Functions/Zftp/zfgcp b/Functions/Zftp/zfgcp new file mode 100644 index 000000000..26a08697d --- /dev/null +++ b/Functions/Zftp/zfgcp @@ -0,0 +1,83 @@ +# function zfgcp { +# ZFTP get as copy: i.e. first arguments are remote, last is local. +# Supposed to work exactly like a normal copy otherwise, i.e. +# zfgcp rfile lfile +# or +# zfgcp rfile1 rfile2 rfile3 ... ldir +# Options: +# -G don't to remote globbing, else do +# -t update the local file times to the same time as the remote. +# Currently this only works if you have the `perl' command, +# and that perl is version 5 with the standard library. +# See the function zfrtime for more gory details. +# +# If there is no current connection, try to use the existing set of open +# parameters to establish one and close it immediately afterwards. + +emulate -L zsh + +local opt optlist nglob remlist rem loc time +integer stat do_close + +while [[ $1 == -* ]]; do + if [[ $1 == - || $1 == -- ]]; then + shift; + break; + fi + optlist=${1#-} + for (( i = 1; i <= $#optlist; i++)); do + opt=$optlist[$i] + case $opt in + G) nglob=1 + ;; + t) time=1 + ;; + *) print option $opt not recognised >&2 + ;; + esac + done + shift +done + +zfautocheck + +# hmm, we should really check this after expanding the glob, +# but we shouldn't expand the last argument remotely anyway. +if [[ $# -gt 2 && ! -d $argv[-1] ]]; then + print "zfgcp: last argument must be a directory." 2>&1 + return 1 +elif [[ $# == 1 ]]; then + print "zfgcp: not enough arguments." 2>&1 + return 1 +fi + +if [[ -d $argv[-1] ]]; then + local dir=$argv[-1] + argv[-1]= + for remlist in $*; do + # zfcd directory hack to put the front back to ~ + if [[ $remlist = $HOME || $remlist = $HOME/* ]]; then + remlist="~${remlist#$HOME}" + fi + if [[ $nglob != 1 ]]; then + zfrglob remlist + fi + if (( $#remlist )); then + for rem in $remlist; do + loc=$dir/${rem:t} + if zftp get $rem >$loc; then + [[ $time = 1 ]] && zfrtime $rem $loc + else + stat=1 + fi + done + fi + done +else + zftp get $1 >$2 || stat=$? +fi + +(( $do_close )) && zfclose + +return $stat +# } |