使scp始终覆盖或创建目录


26

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

scp -prq server1:dir1 server2:dir2

如果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

仍然不确定如何在单个命令中执行此操作,即使可能也无法确定。

欢呼@mindthemonkey,有时只是获得新鲜的观点可以帮助指明方向。


您具有scp访问权限,但没有ssh吗?
马特

没错
Giles 2013年

唯一的问题是,您将在任何失败时尝试第二个副本,这不一定是不存在的dir2。也许您可以提出一个实际上不执行任何操作的测试(例如,复制空白目录)。然后根据输出结果运行scp1或scp2
Matt

好点,如果有什么想法,我会牢记这一点,然后重新发布。
吉尔斯

可以sftp吗?然后检查的输出cd dir2
马特

Answers:


34

使用以下“点”语法:

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

这将复制该目录的内容,而不是目录本身。而且我相信它比*遍历更容易携带。


2
-p⇒“保留原始文件的修改时间,访问时间和模式。” -r⇒“以递归方式复制整个目录。” -q⇒“禁用进度表。” 资料来源:computerhope.com/unix/scp.htm
kr85

1
这给了我一个错误:scp: error: unexpected filename: .
Andrew Koster

1

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

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 - )"

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


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

@Giles是在说这行得通吗?
马特2013年

1
奇怪的是,我编辑了它,但是它已经丢失了-不,那是行不通的,如果该目录不存在,那么scp会给出一个错误。此外,在这种特殊情况下(具有用户权限的问题),我没有ssh可用。不过,这确实给了我一个主意,因为我在脚本中执行此操作时,可以尝试上述操作,捕获任何错误,并在出现错误时从我的第一篇文章中尝试基本版本。感谢您的帮助@mindthemonkey
Giles

1
当目标目录对我不存在时,它会错误显示“是目录”。
马特

1
是的,我也是,鉴于目录不存在,这是一种奇怪的错误。
吉尔斯2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.