在 for 循环中将字符串传递给 scp 时出错

在 for 循环中将字符串传递给 scp 时出错

我正在通过 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'

相关内容