SCP问题与多个文件-UNIX



复制多个文件时会出现错误。下面的命令仅复制第一个文件,并给出其余文件的错误。有人可以帮我吗?

命令:

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

您的命令使用命令替换生成文件列表。您的假设是,SCP的"源"符号中有一些魔术,这会导致您的find命令生成的列表中的多个成员假定在$host上生存,而实际上您的命令可能会扩展到以下内容:

scp remotehost:/incoming/someoldfile anotheroldfile /incoming

只有第一个文件是从$host复制的,因为其余的都不包括路径开头的$host:。它们在您的 local /incoming目录中找不到,因此错误。

oh,此外,您还没有逃脱find命令中的星号,因此2018*可能会扩展到有关用户的登录目录中的多个文件。我无法从这里分辨,这取决于您的操作系统和外壳配置。

我应该指出,您正在提供经典解析问题的另一个例子。特殊字符会打破您的命令。通常为此问题提供的"更好"解决方案往往是使用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,则可以将其删除并在ssh之前运行cd /incoming,或者您可以用卷发式命令命令替换该管段:{ cd /incoming && tar -xvf -; }

卷曲支撑符号假定具有posix的外壳(bash,zsh等(。如果您坚持使用的话,其余的可能应该在CSH中效果很好。

有限的保修:最佳努力。在动物或计算机上未经测试。您的里程可能会有所不同。可能包含坚果。

如果这对您不起作用,请戳它直到它。

最新更新