使scp总是覆盖或创build目录

我正在使用scp将一个目录从一个远程服务器复制到另一个远程服务器上的新目录(IE只是更改名称),如:

scp -prq server1:dir1 server2:dir2 

如果dir2在server2上不存在,它将正常工作,它会创build一个名为dir2的新目录,其中包含server1上dir1的所有内容。

当server2上已经存在dir2时,问题就出现了(注意:我无法预先知道这个事情,或者事先没有办法在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 

仍然不知道如何在一个单一的命令,甚至如果可能的话做到这一点。

干杯@有时只是得到一个新的观点可以帮助指路。

使用这个“点”的语法:

 scp -prq server1:dir1/. server2:dir2/ 

这复制该目录的内容,而不是目录本身。 而且我相信它比* globbing更便携。

通常为了控制目录的创build,你需要使用尾部/来暗示一个完整的path,但是我认为如果目录不存在,那么这个目录就无法创build:

 scp -prq server1:dir1/* server2:dir2/ 

这也可能错过隐藏。 文件由于* glob扩展(没有一些棘手的shell特定的工作 )

你可以用sshtar来区别它。

 ssh server1 "cd dir1 && tar -cf - ." | ssh server2 "( mkdir -p dir2; cd dir2 && tar -xf - )" 

但这意味着stream量通过您的本地机器。