多个文件的SCP问题 - UNIX

时间:2018-03-26 04:01:51

标签: unix ssh scp

复制多个文件时出错。下面的命令是仅复制第一个文件并为其余文件提供错误。有人可以帮帮我。

命令:

scp $host:$(ssh -n $host "find /incoming -mmin -120 -name 2018*") /incoming/

结果:

user@host:~/scripts/OTA$ scp $host:$(ssh -n $host "find /incoming -mmin -120 -name 2018*") /incoming/
Password:
Password:
2018084session_event 100% |**********************************************************************************************************|  9765 KB    00:00
cp: cannot access /incoming/2018084session_event_log.195-10.45.40.9
cp: cannot access /incoming/2018084session_event_log.195-10.45.40.9_2_3

1 个答案:

答案 0 :(得分:1)

您的命令使用命令替换生成文件列表。你的假设是"来源" scp的表示法会导致find命令生成的列表的多个成员被假定为$host,而实际上您的命令可能会扩展为:

scp remotehost:/incoming/someoldfile anotheroldfile /incoming

仅从$host复制第一个文件,因为其余文件都没有在路径的开头包含$host:。它们未在本地 /incoming目录中找到,因此出错。

哦,此外,您还没有在find命令中转义星号,因此2018*可能会扩展到相关用户登录目录中的多个文件。我不能从这里说出来,这取决于你的操作系统和shell配置。

我应该指出,你提供了另一个经典Parsing LS问题的例子。特殊字符会破坏你的命令。 "更好"通常为此问题提供的解决方案往往是使用for循环,但这并不是您正在寻找的。相反,我建议您制作tar个您正在寻找的文件。这样的事情可能会这样:

ssh "$host" "find /incoming -mmin -120 -name 2018\* -exec tar -cf - {} \+" |
tar -xvf - -C /incoming

这是做什么的?

  • ssh根据您的条件运行远程find命令。
  • find将文件名列表(无论特殊字符)作为选项提供给tar命令。
  • tar命令将其结果发送到stdout(-f -)。
  • 然后将该输出传送到本地计算机上运行的另一个tar,该计算机将提取该流。

如果您的tar不支持-C,您可以将其删除并在cd /incoming之前运行ssh,或者您可以更换带有花括号命令的管段:{ cd /incoming && tar -xvf -; }

大括号表示法假定一个类似POSIX的shell(bash,zsh等)。其余的这个应该在csh中同样有效,如果这是你所坚持的。

有限保修:尽力而为。在动物或计算机上未经测试。你的milage可能会有所不同。可能含有坚果。

如果这对你不起作用,请直到它为止。