使 scp 始终覆盖或创建目录

使 scp 始终覆盖或创建目录

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

scp -prq server1:dir1 server2:dir2

如果 server2 上不存在 dir2,此方法可以正常工作,它会创建一个名为 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

仍然不确定如何通过单个命令执行此操作,或者是否可能。

谢谢@mindthemonkey,有时仅仅获得一个新的观点就能帮助指明方向。

答案1

使用这个“点”语法:

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

这会复制该目录的内容,而不是目录本身。而且我相信它比通配符更易于*移植。

答案2

通常,为了控制目录创建,您需要使用尾随/来表示完整路径,但我认为如果目录不存在,则创建目录将失败:

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

由于 * glob 扩展(没有一些棘手的 shell 特定工作

您可以使用 和 以不同的方式解决这个ssh问题tar

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

但这意味着流量要通过您的本地机器进行。

答案3

首先使用 ssh 清除它,然后使用 scp 重新创建它。例如在脚本文件中...

ssh -i ~/.ssh/[private_key] user@server2 "rm -rf dir2; 退出;"

scp -prq 服务器1:dir1 服务器2:dir2

答案4

我曾经为同样的问题而苦恼,最后我半途而废:如果 dir2 是[STUFF]/parent/child2,我重命名或复制或链接 dir1(根据情况而定)到 server1 上的 dir1_child2 ,以便它的最后一个路径组件也是child2,然后执行

scp -prq server1:dir1_child2 server2:[STUFF]/parent

无论 child2 是否存在于 dir2 的父目录中,此命令都会运行,如果存在,则愉快地替换 dir2。

相关内容