我通过ssh通过查找从服务器抓取文件列表
for f in `ssh -p ${SSH_PORT} -l ${SSH_USER} ${SSH_HOST} -t "find ${DIR_REMOTE} -type f | grep jpg" 2> /dev/null`
当我在for循环( echo ${f}
)主体中回显列表时,一切正常:
/a3/obieg/skan001/skan001.jpg /a3/obieg/skan001/skan000.jpg /a3/obieg/skan001/skan003.jpg /a3/obieg/skan001/skan002.jpg /a3/obieg/skan.jpg
( scp -p -P ${SSH_PORT} ${SSH_USER}@${SSH_HOST}:"${f}" "${DIR_SUB}${2}_$(date +%Y%m%d_%H%M%S_%N.jpg)"
),结果是:
: No such file or directory001.jpg : No such file or directory000.jpg : No such file or directory003.jpg : No such file or directory002.jpg : No such file or directory
我无法理解这里发生了什么
整个脚本:
SSH_USER=username SSH_HOST=${1} SSH_PORT=22 DIR_REMOTE="/a3/obieg/" DIR_LOCAL="/b2/skany_temp_test/ot/" DIR_SUB="${DIR_LOCAL}${2}/" # foldery mkdir "${DIR_LOCAL}" 2> /dev/null mkdir "${DIR_SUB}" 2> /dev/null # sync for f in `ssh -p ${SSH_PORT} -l ${SSH_USER} ${SSH_HOST} -t "find ${DIR_REMOTE} -type f | grep jpg" 2> /dev/null` do # echo ${f} scp -p -P ${SSH_PORT} ${SSH_USER}@${SSH_HOST}:"$f" "${DIR_SUB}${2}_$(date +%Y%m%d_%H%M%S_%N.jpg)" # ssh -p ${SSH_PORT} -l ${SSH_USER} ${SSH_HOST} -t "rm ${f}" done
好 – 我想我已经find了解决scheme。
我已经用rsync
replace了scp
,并且显示了完整的path(在这种情况下,它是以ascii-sequence #\015
结尾的)。
它看起来像scp
正在寻找一个文件/some-path/some-file.jpg\r
,因为for循环划分行\n
ssh -t
分配一个伪terminal,它像screen
命令一样返回类似于窗口的行尾( \r\n
)。
我已经通过dos2unix
pipe道每个SSH的答案,现在它的作品。
你不需要这样做
${SSH_USER}@${SSH_HOST}:"$(echo $f)"
在您的SCP命令。 我希望这应该工作得很好:
${SSH_USER}@${SSH_HOST}:"${f}"
编辑:重新阅读下面的答案,如果你要在复制命令echo
你需要做echo -n
禁止在最后打印一个换行符。
find ${DIR_REMOTE} -type f -name "*.jpg" 2>/dev/null
find ${DIR_REMOTE} -type f -name "*.jpg" 2>/dev/null | sed 's/\r//g'