我正在通过 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 (在同一个循环中)复制它时(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
答案1
好的-我想我已经找到了解决方案。
我已将scp
其替换为rsync
,它向我展示了完整路径(在本例中以 ascii-sequence 结尾#\015
)。
看起来像是 scp
在寻找一个文件/some-path/some-file.jpg\r
,因为 for 循环将行除以\n
ssh -t
分配一个伪终端,返回类似窗口的行尾(\r\n
),就像screen
命令一样。
我已经通过管道传输了每个 ssh 答案dos2unix
,现在它可以正常工作了。
答案2
你不需要做
${SSH_USER}@${SSH_HOST}:"$(echo $f)"
在您的 SCP 命令中。我希望这应该可以正常工作:
${SSH_USER}@${SSH_HOST}:"${f}"
编辑:重新阅读下面的答案,如果您要echo
在复制命令中执行操作,则需要禁用echo -n
在末尾打印换行符。
答案3
- 你可以写寻找部分效率更高(当您有大量文件时才有意义)
find ${DIR_REMOTE} -type f -name "*.jpg" 2>/dev/null
- 你也可以条使用 sed 的回车符(\r):
find ${DIR_REMOTE} -type f -name "*.jpg" 2>/dev/null | sed 's/\r//g'