86

我需要重新安装我们的一台服务器,作为预防措施,我想将/home/etc/opt和移动/Services到备份服务器。

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

是否可以scp忽略符号链接(或者实际上将链接复制为链接而不是目录或文件)?如果没有,还有其他方法吗?

4

5 回答 5

87

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

rsync --progress -avhe ssh /usr/local/  XXX.XXX.XXX.XXX:/BackUp/usr/local/
于 2012-06-14T10:56:22.883 回答
34

我发现rsync方法对我不起作用,但是我在该网站上找到了另一种方法(www.docstore.mik.ua/orelly)。

特别是“O'Reilly:SSH:安全外壳。权威指南”的第 7.5.3节。

7.5.3. 目录的递归副本

...

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

$ tar cf - /usr/local/bin | ssh server.example.com tar xf -
于 2012-11-05T17:06:41.987 回答
18

使用taroverssh作为发送者和接收者也可以做到这一点:

cd $DEST_DIR
ssh user@remote-host 'cd $REMOTE_SRC_DIR; tar cf - ./' | tar xvf -
于 2014-03-31T11:29:32.410 回答
2

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

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

-f 选项将仅查找常规文件并忽略符号链接。您需要在源主机上发出此命令。希望这可以帮助一些用户在我的情况。如果我错过了什么,请告诉我。

于 2017-05-30T20:52:37.950 回答
0

一种可以在客户端执行以使用 tar + ssh 命令从服务器复制文件夹的单线解决方案。

ssh user@<Server IP/link> 'mkdir -p <Remote destination directory;cd <Remote destination directory>; tar cf - ./' | tar xf - C <Source destination directory>

注意:mkdir 是必须的,如果远程目标目录不存在,那么该命令将简单地压缩远程服务器的整个主目录并将其解压缩到客户端。

于 2020-08-26T08:33:36.350 回答