多个文件的 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 中同样有效。
有限保修:仅尽力而为。未经动物或计算机测试。您的里程可能会有所不同。可能含有坚果。
如果这对您不起作用,请戳它直到它起作用。
复制多个文件时出错。下面的命令仅复制第一个文件并为其余文件提供错误。谁能帮帮我。
命令:
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 中同样有效。
有限保修:仅尽力而为。未经动物或计算机测试。您的里程可能会有所不同。可能含有坚果。
如果这对您不起作用,请戳它直到它起作用。