复制多个文件时出错。下面的命令是仅复制第一个文件并为其余文件提供错误。有人可以帮帮我。
命令:
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
答案 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可能会有所不同。可能含有坚果。
如果这对你不起作用,请直到它为止。