2012-06-14 205 views
58

我需要重新安装我们的服务器之一,并且为了预防,我想将/home/etc,/opt/Services移动到备份服务器。是否可以让SCP在复制过程中忽略符号链接?

但是,我有一个问题:由于大量的符号链接,许多文件被复制多次。

是否有可能使scp忽略符号链接(或实际上是将链接复制为链接而不是目录或文件)?如果没有,是否有另一种方式来做到这一点?

回答

55

我知道这是可能的,我只是拿错了工具。我做到了与rsync的

rsync --progress -avhe ssh /usr/local/ XXX.XXX.XXX.XXX:/BackUp/usr/local/ 
+0

那么这个命令是什么?它忽略符号链接还是创建新链接? -avhe? –

+1

'a'归档(保留东西),''v' verbose','h'人类可读输出,'e'指定要使用的服务(在本例中为'ssh')。阅读更多[在这里](https://linux.die.net/man/1/rsync) – tenCupMaximum

23

我发现the rsync method并没有为我工作,但是我发现这个网站(www.docstore.mik.ua/orelly)上所做的工作的选择。

具体部分7.5.3 of "O'Reilly: SSH: The Secure Shell. The Definitive Guide"

7.5.3。目录的递归复制

...

虽然SCP可以复制的目录,它不一定是最好的方法。如果您的目录包含硬链接或软链接,它们将不会被复制。链接被复制为纯文件(链接目标),更糟糕的是,循环目录链接导致scp1无限循环。 (scp2会检测符号链接并复制它们的目标。)其他类型的特殊文件(如命名管道)也无法正确复制。更好的解决方案是使用tar,它可以正确处理特殊文件,并将其发送到远程机是未解压,经由SSH:

$ tar cf - /usr/local/bin | ssh server.example.com tar xf - 
+1

这是一个很好的建议,如果rsync没有安装在远程端,或(稍作修改),如果你碰巧已经有源目录的tarball。 –

+0

它需要一个“p”(tar xpf)来保留目的地的权限。 –

12

使用tar超过ssh为发送者和接收者是卓有成效的,以及:

cd $DEST_DIR 
ssh [email protected] 'cd $REMOTE_SRC_DIR; tar cf - ./' | tar xvf - 
+0

我在源端添加'--one-file-system'并在目标端'p'添加了权限。 – ceving

+0

焦油说的手册页; --one-file-system =不交叉挂载点 – AnneTheAgile

0

一种解决方案是使用一个壳管。我遇到了一些情况,我得到了一些* .gz文件和一些软件生成的符号链接,链接到相同的* .gz文件,名称稍短。如果我只是使用scp,那么符号链接将被复制为常规文件并导致重复。我知道rsync可以忽略符号链接,但我的gz文件没有使用可syncable选项进行压缩,并且同步在复制这些gz文件时非常慢。所以我简单地使用下面的脚本在要复制的文件:

find . -type f -exec scp {} target_host:/directory/name/data \; 

-f选项只能找到普通文件,而忽略符号链接。您需要在源主机上提供此命令。希望这可以帮助一些用户在我的情况。让我知道我是否错过了任何东西。