将string传递给for循环时出错

我通过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。

我已经用rsyncreplace了scp ,并且显示了完整的path(在这种情况下,它是以ascii-sequence #\015结尾的)。

它看起来像scp正在寻找一个文件/some-path/some-file.jpg\r ,因为for循环划分行\n

ssh -t分配一个伪terminal,它像screen命令一样返回类似于窗口的行尾( \r\n )。

我已经通过dos2unixpipe道每个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
  • 你也可以用sed去掉回车符(\ r):
    find ${DIR_REMOTE} -type f -name "*.jpg" 2>/dev/null | sed 's/\r//g'