多个文件的 SCP 问题 - UNIX

SCP issue with multiple files - 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 的 "source" 表示法中存在一些魔法,这会导致您的 find 命令生成的列表中的多个成员被假定存在于 $host,而实际上您的命令可能会扩展为类似以下内容:

scp remotehost:/incoming/someoldfile anotheroldfile /incoming

仅从 $host 复制第一个文件,因为其余的 none 在路径的开头包含 $host:。在您的 local /incoming 目录中找不到它们,因此出现错误。

哦,此外,您没有在 find 命令中转义星号,因此 2018* 可能会扩展到相关用户登录目录中的多个文件。我无法从这里判断,这取决于您的 OS 和 shell 配置。

我应该指出,您提供了经典 Parsing LS 问题的另一个例子。特殊字符会破坏您的命令。通常针对此问题提供的 "better" 解决方案往往是使用 for 循环,但这并不是您真正想要的。相反,我建议为您要查找的文件创建 tar。像这样的事情可能会做:

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

这是做什么的?

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

如果您的 tar 不支持 -C,您可以删除它并 运行 在 ssh 之前添加 cd /incoming,或者您可能能够用 curly-braced 命令替换该管段:{ cd /incoming && tar -xvf -; }

花括号表示法假定 POSIX-like shell(bash、zsh 等)。如果您坚持使用 csh,那么其余的内容可能在 csh 中同样有效。

有限保修:仅尽力而为。未经动物或计算机测试。您的里程可能会有所不同。可能含有坚果。

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