mirror of
git://git.code.sf.net/p/zsh/code
synced 2024-10-03 17:31:33 +02:00
63 lines
1.4 KiB
Plaintext
63 lines
1.4 KiB
Plaintext
|
# function zftransfer {
|
||
|
# Transfer files between two distinct sessions. No remote globbing
|
||
|
# is done, since only single pairs can be transferred.
|
||
|
|
||
|
emulate -L zsh
|
||
|
|
||
|
local sess1 sess2 file1 file2 oldsess=${ZFTP_SESSION}
|
||
|
|
||
|
if [[ $# -ne 2 ]]; then
|
||
|
print "Usage: zftransfer sess1:file1 sess2:file2" 1>&2
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
if [[ $1 = *:* ]]; then
|
||
|
sess1=${1%%:*}
|
||
|
file1=${1#*:}
|
||
|
fi
|
||
|
: ${sess1:=$ZFTP_SESSION}
|
||
|
|
||
|
if [[ $2 = *:* ]]; then
|
||
|
sess2=${2%%:*}
|
||
|
file2=${2#*:}
|
||
|
fi
|
||
|
: ${sess2:=$ZFTP_SESSION}
|
||
|
if [[ -z $file2 || $file2 = */ ]]; then
|
||
|
file2="${file2}${file1:t}"
|
||
|
fi
|
||
|
|
||
|
if [[ $sess1 = $sess2 ]]; then
|
||
|
print "zftransfer: must use two distinct sessions." 1>&2
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
zftp session $sess1
|
||
|
zfautocheck || return 1
|
||
|
|
||
|
# It's more useful to show the progress for the second part
|
||
|
# of the pipeline, but unfortunately that can't necessarily get
|
||
|
# the size from the pipe --- and if it does, it's probably wrong.
|
||
|
# To avoid that, try to get the size and set it for the progress to
|
||
|
# see.
|
||
|
if [[ $zfconfig[progress] != none ]]; then
|
||
|
local ZFTP_TSIZE array tmpfile=${TMPPREFIX}zft$$
|
||
|
zftp remote $file1 >$tmpfile 2>/dev/null
|
||
|
array=($(<$tmpfile))
|
||
|
rm -f $tmpfile
|
||
|
[[ $#array -eq 2 ]] && ZFTP_TSIZE=$array[1]
|
||
|
fi
|
||
|
|
||
|
# We do the RHS of the pipeline in a subshell, too, so that
|
||
|
# the LHS can get SIGPIPE when it exits.
|
||
|
{ zfconfig[progress]=none
|
||
|
zftp get $file1 } |
|
||
|
( zftp session $sess2
|
||
|
zfautocheck && zftp put $file2 )
|
||
|
|
||
|
local stat=$?
|
||
|
|
||
|
zftp session $oldsess
|
||
|
|
||
|
return $stat
|
||
|
# }
|