【发布时间】:2012-06-17 07:50:17
【问题描述】:
我需要重新安装我们的一台服务器,作为预防措施,我想将/home、/etc、/opt 和/Services 移动到备份服务器。
但是,我有一个问题:由于大量的符号链接,很多文件被复制了多次。
是否可以让scp 忽略符号链接(或者实际上将链接复制为链接而不是目录或文件)?如果没有,还有其他方法吗?
【问题讨论】:
标签: scp
我需要重新安装我们的一台服务器,作为预防措施,我想将/home、/etc、/opt 和/Services 移动到备份服务器。
但是,我有一个问题:由于大量的符号链接,很多文件被复制了多次。
是否可以让scp 忽略符号链接(或者实际上将链接复制为链接而不是目录或文件)?如果没有,还有其他方法吗?
【问题讨论】:
标签: scp
我知道这是可能的,我只是拿错了工具。我用 rsync
做到了rsync --progress -avhe ssh /usr/local/ XXX.XXX.XXX.XXX:/BackUp/usr/local/
【讨论】:
a 是存档(保留内容),v 详细,h 人类可读输出,e 指定您要使用的服务(在本例中为 ssh)。阅读更多over here
我发现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 -
【讨论】:
scp 或 rsync 运行得更好更快。
使用tar 而不是ssh 作为发送者和接收者也可以做到这一点:
cd $DEST_DIR
ssh user@remote-host 'cd $REMOTE_SRC_DIR; tar cf - ./' | tar xvf -
【讨论】:
--one-file-system,在目标端添加了p以保留权限。
一种解决方案是使用壳管。我有一种情况,我得到了一些 *.gz 文件和由某些软件生成的符号链接,以链接到名称稍短的相同 *.gz 文件。如果我只是使用 scp,那么符号链接将被复制为常规文件并导致重复。我知道 rsync 可以忽略符号链接,但是我的 gz 文件没有使用可同步选项进行压缩,并且同步在复制这些 gz 文件时非常慢。所以我只是使用以下脚本来复制文件:
find . -type f -exec scp {} target_host:/directory/name/data \;
-f 选项将只查找常规文件并忽略符号链接。您需要在源主机上发出此命令。希望这可以帮助一些用户在我的情况。如果我遗漏了什么,请告诉我。
【讨论】:
一种可以在客户端执行以使用 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 是必须的,如果远程目标目录不存在,那么该命令将简单地压缩远程服务器的整个主目录并将其解压缩到客户端。
【讨论】: