使 scp 始终覆盖或创建目录

Gil*_*les 31 linux scp

我正在使用 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:错误:意外的文件名:.` (13认同)
  • -p ⇒“保留原始文件的修改时间、访问时间和模式。” -r ⇒ “递归复制整个目录。” -q ⇒ “禁用进度表。” 来源:https://www.computerhope.com/unix/scp.htm (3认同)

Mat*_*att 2

通常要控制目录创建,您需要使用尾随/来暗示完整路径,但我认为如果目录不存在,这将无法创建目录:

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)

但这意味着流量会通过您的本地计算机。