使用rsync同步文件

Posted by Elton's Blog on September 4, 2009

什么是 rsync?

rsync 应用程序是在 Linux® 和 UNIX® 上广泛使用的文件传输和同步程序,而且它已经移植到了 Windows® 上。它的关键特性是一个非常快的算法,它只通过数据链路发送文件差异,因此把机器之间传输的数据总量降低到最低限度。(如果使用 File Transfer Protocol [FTP] 或 rcp 和 scp 等实用程序,那么即使只修改了一个字节,也会发送完整的文件)。当然,rsync 并非只能处理现有的文件:它还可以处理只在链路一端存在的文件和目录。最后,通过压缩数据来优化通信,因此可以通过非宽带连接使用这个工具。

使用 rsync

我们使用 rsync 把本地文件直接同步到一个远程服务器。还可以把远程服务器同步到本地,或者同步两个本地目录,但是不能同步两个远程服务器。

效果相同但格式不同的两个rsync命令

rsync --compress --recursive --delete --links 
--times --perms --owner --group 
--verbose --progress --stats 
--rsh="ssh" 
--exclude "*bak" --exclude "*~" 
/my/path/at/the/laptop/* myserver:/some/path/at/the/server

rsync -zrltpogve "ssh" --progress --stats --delete 
--exclude "*bak" --exclude "*~" 
/my/path/at/the/laptop/* myserver:/some/path/at/the/server

注意,上面命令中选项的次序是任意的,而且大多数选项有短格式。首先,–compress(或 -z)指定将压缩数据,这可以节省带宽。应该总是使用这个选项。(在非常高速的数据链路上,不进行压缩可能也可以,但是对于大多数远程连接,压缩都是有帮助的)。可以使用补充选项 –compress-level=level 指定压缩的级别;但是,通常可以接受标准的压缩级别。

–recursive (-r) 选项让 rsync 递归地复制所有目录。这会复制目录中的所有文件,包括其中的子目录及其内容。如果不需要这个功能,可以使用 –dirs 选项 (-d) 产生相反的效果:跳过子目录及其内容。

在默认情况下,rsync 把需要的文件复制到目标计算机,但是并不删除额外文件。通过使用 –delete 选项,目标目录会与原目录保持完全一致。但是要注意:如果把一个空目录同步到远程目录,就会删除远程目录中的所有内容!

如果原目录中有符号链接,–links 选项(或 -l)会在目标目录中重新创建这些符号链接。另一种方法是使用 –copy-links(或 -L)复制符号链接指向的文件或目录,而不是复制符号链接本身。如果有符号链接指向复制的树之外的文件或目录(这是一种安全风险),可以使用 –copy-unsafe-links。–safe-links 选项忽略这样的链接,这更安全。

后面四个选项(–times、–perms、–owner 和 –group 或 -tpog)分别让 rsync 保持原来的更新时间戳、权限、所有者和组信息。同时指定所有这些选项的简便方法是使用 –archive(或 -a),这还会设置 –recursive 和 –links 选项。

后面三个选项(–verbose、–progress 和 –stats)提供关于 rsync 正在执行的操作的大量信息。如果对这些信息不感兴趣,只需跳过它们,除非出现错误,rsync 会悄悄地运行。

尽管当前的 rsync 版本默认使用 ssh,但是可以使用 –rsh(或 -e)选项强制使用 ssh。如果需要使用额外的 ssh 参数(例如希望让 ssh 使用非标准端口),可以添加这些参数,例如 –rsh “ssh -p 12345”。

可以使用 –exclude 选项(和对应的 –include)选择要同步的文件。在这个示例中,排除了常见的备份文件。应该根据需要排除和包含文件,从而优化发送的内容。

最后,指定源路径和目标路径。不要忘记最后的 /,否则结果可能不符合期望。可以通过查看文档了解 some/path、some/path/ 和 some/path/ 之间的差异。但是,使用 /* 是最保险的方法。

可以使用 -a 选项 (–archive) 简化清单 1 中的命令,见 清单 2。(如果作为根在服务器上运行 rsync,-a 选项可能会复制一些额外的内容 — 请查阅文档 — 这不是一种安全的做法)。rsync 还有许多选项;可以通过 rsync –help 和 man rsync 了解所有选项。