我正在使用 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。