复制多个文件时会出现错误。下面的命令仅复制第一个文件,并给出其余文件的错误。有人可以帮我吗?
命令:
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中效果很好。
有限的保修:最佳努力。在动物或计算机上未经测试。您的里程可能会有所不同。可能包含坚果。
如果这对您不起作用,请戳它直到它。