我正在使用 scp 将目录从一个远程服务器复制到另一个远程服务器上的新目录(即只是更改名称),例如:
scp -prq server1:dir1 server2:dir2
Run Code Online (Sandbox Code Playgroud)
如果 dir2 在 server2 上不存在,这可以正常工作,它会创建一个名为 dir2 的新目录,其中包含 server1 上 dir1 的所有内容。
当 dir2 已存在于 server2 上时,问题就出现了(注意:我无法事先知道这一点,也无法事先在 server2 上的 dir2 上进行删除)- 发生的情况是我在 dir2 中获得了一个名为 dir1 的 dir1 副本。
我确信我缺少一些基本的东西,但我似乎无法解决它。
非常感谢任何帮助!
问候,
贾尔斯
好的,我的代表不到 10 人,不能等待 8 小时,所以我得到了以下信息:
这是一个对我有用的脚本:
#!/bin/sh
echo "method 1"
scp -prq server1:dir1/* server2:dir2/ >/dev/null 2>&1
if [ "$?" -ne "0" ]; then
echo "failed ... trying method 2"
scp -prq server1:dir1 server2:dir2
fi
exit
Run Code Online (Sandbox Code Playgroud)
仍然不确定如何在单个命令中执行此操作,或者如果可能的话。
干杯@mindthemonkey,有时只是获得一个新的观点可以帮助指明方向。
小智 39
使用这个“点”语法:
scp -prq server1:dir1/. server2:dir2/
Run Code Online (Sandbox Code Playgroud)
这将复制该目录的内容,而不是目录本身。而且我相信它比*通配符更便携。
通常要控制目录创建,您需要使用尾随/来暗示完整路径,但我认为如果目录不存在,这将无法创建目录:
scp -prq server1:dir1/* server2:dir2/
Run Code Online (Sandbox Code Playgroud)
这也可能是隐藏的错过。由于 * glob 扩展而产生的文件(没有一些棘手的 shell 特定工作)
您可以使用ssh和进行不同的处理tar。
scp -prq server1:dir1/* server2:dir2/
Run Code Online (Sandbox Code Playgroud)
但这意味着流量会通过您的本地计算机。