如何使用Rsync同步本地和远程目录

来自菜鸟教程
跳转至:导航、​搜索

介绍

Rsync,代表remote sync,是一个远程和本地文件同步工具。 它使用一种算法,通过仅移动已更改的文件部分来最小化复制的数据量。

在本教程中,我们将定义 Rsync,回顾使用 rsync 时的语法,解释如何使用 Rsync 与远程系统同步,以及其他可用的选项。

先决条件

为了练习使用 rsync 在本地和远程系统之间同步文件,您需要两台机器分别充当本地计算机和远程计算机。 这两台机器可以是虚拟专用服务器、虚拟机、容器或个人计算机,只要它们已正确配置即可。

如果您打算使用服务器来遵循本指南,那么谨慎的做法是使用管理用户设置它们并在每个用户上配置防火墙。 要设置这些服务器,请按照我们的 初始服务器设置指南

无论您使用什么类型的机器来学习本教程,您都需要在这两台机器上创建 SSH 密钥。 然后,将每个服务器的公钥复制到其他服务器的 authorized_keys 文件中,如该指南 步骤 2 中所述。

本指南已在运行 Ubuntu 20.04 的计算机上进行了验证,尽管它通常应该适用于运行基于 Linux 的操作系统且安装了 rsync 的任何计算机。

定义 Rsync

Rsync 是一个非常灵活的网络同步工具。 由于它在 Linux 和类 Unix 系统上无处不在,并且作为系统脚本工具很受欢迎,因此默认情况下它包含在大多数 Linux 发行版中。

了解 Rsync 语法

rsync 的语法与其他工具类似,例如 sshscpcp

首先,通过运行以下命令切换到您的主目录:

cd ~

然后创建一个测试目录:

mkdir dir1

创建另一个测试目录:

mkdir dir2

现在添加一些测试文件:

touch dir1/file{1..100}

现在有一个名为 dir1 的目录,其中包含 100 个空文件。 通过列出文件进行确认:

ls dir1
Outputfile1    file18  file27  file36  file45  file54  file63  file72  file81  file90
file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
file17   file26  file35  file44  file53  file62  file71  file80  file9   file99

您还有一个名为 dir2 的空目录。 要在同一系统上同步 dir1dir2 的内容,您将运行 rsync 并使用 -r 标志,它代表“递归”和目录同步是必需的:

rsync -r dir1/ dir2

另一种选择是使用 -a 标志,它是一个组合标志,代表“归档”。 此标志以递归方式同步并保留符号链接、特殊和设备文件、修改时间、组、所有者和权限。 它比 -r 更常用,是推荐使用的标志。 运行与上一个示例相同的命令,这次使用 -a 标志:

rsync -a dir1/ dir2

请注意,在前两个命令的语法中,第一个参数的末尾有一个斜杠 (/),并在此处突出显示:

rsync -a dir1/ dir2

这个尾部斜杠表示 dir1 的内容。 如果没有尾部斜杠,dir1,包括目录,将被放置在 dir2 中。 结果将创建一个如下所示的层次结构:

~/dir2/dir1/[files]

另一个提示是在执行 rsync 命令之前仔细检查您的参数。 Rsync 提供了一种通过传递 -n--dry-run 选项来执行此操作的方法。 -v 标志,意思是“详细”,也是获得适当输出所必需的。 您将在以下命令中组合 anv 标志:

rsync -anv dir1/ dir2
Outputsending incremental file list
./
file1
file10
file100
file11
file12
file13
file14
file15
file16
file17
file18
. . .

现在将该输出与删除尾部斜杠时收到的输出进行比较,如下所示:

rsync -anv dir1 dir2
Outputsending incremental file list
dir1/
dir1/file1
dir1/file10
dir1/file100
dir1/file11
dir1/file12
dir1/file13
dir1/file14
dir1/file15
dir1/file16
dir1/file17
dir1/file18
. . .

此输出现在表明目录本身已被传输,而不仅仅是目录中的文件。

使用 Rsync 与远程系统同步

要使用 rsync 与远程系统同步,您只需要在本地和远程计算机之间配置 SSH 访问权限,以及在两个系统上安装 rsync。 在两台机器之间验证 SSH 访问后,您可以使用以下语法将上一节中的 dir1 文件夹同步到远程机器。 请注意,在这种情况下,您要传输实际目录,因此您将省略尾部斜杠:

rsync -a ~/dir1 username@remote_host:destination_directory

此过程称为 push 操作,因为它将目录从本地系统“推送”到远程系统。 相反的操作是pull,用于将远程目录同步到本地系统。 如果 dir1 目录位于远程系统而不是本地系统上,则语法如下:

rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine

cp 和类似工具一样,源始终是第一个参数,目标始终是第二个。

    1. 使用其他 Rsync 选项

Rsync 提供了许多用于更改实用程序默认行为的选项,例如您在上一节中了解的标志选项。

如果您正在传输尚未压缩的文件,例如文本文件,您可以通过使用 -z 选项添加压缩来减少网络传输:

rsync -az source destination

-P 标志也很有帮助。 它结合了标志 --progress--partial。 第一个标志为传输提供进度条,第二个标志允许您恢复中断的传输:

rsync -azP source destination
Outputsending incremental file list
created directory destination
source/
source/file1
              0 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=99/101)
sourcefile10
              0 100%    0.00kB/s    0:00:00 (xfr#2, to-chk=98/101)
source/file100
              0 100%    0.00kB/s    0:00:00 (xfr#3, to-chk=97/101)
source/file11
              0 100%    0.00kB/s    0:00:00 (xfr#4, to-chk=96/101)
source/file12
              0 100%    0.00kB/s    0:00:00 (xfr#5, to-chk=95/101)
. . .

如果您再次运行该命令,您将收到一个缩短的输出,因为没有进行任何更改。 这说明了 Rsync 使用修改时间来确定是否进行了更改的能力:

rsync -azP source destination
Outputsending incremental file list
sent 818 bytes received 12 bytes 1660.00 bytes/sec
total size is 0 speedup is 0.00

假设您要使用如下命令更新某些文件的修改时间:

touch dir1/file{1..10}

然后,如果您要再次运行 rsync-azP,您会在输出中注意到 Rsync 如何智能地仅重新复制更改的文件:

rsync -azP source destination
Outputsending incremental file list
file1
            0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=99/101)
file10
            0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=98/101)
file2
            0 100%    0.00kB/s    0:00:00 (xfer#3, to-check=87/101)
file3
            0 100%    0.00kB/s    0:00:00 (xfer#4, to-check=76/101)
. . .

为了使两个目录真正保持同步,如果从源目录中删除了文件,则必须从目标目录中删除它们。 默认情况下,rsync 不会从目标目录中删除任何内容。

您可以使用 --delete 选项更改此行为。 在使用此选项之前,您可以使用 -n--dry-run 选项进行测试,以防止不必要的数据丢失:

rsync -an --delete source destination

如果您希望排除位于您正在同步的目录中的某些文件或目录,您可以通过在 --exclude= 选项后面的逗号分隔列表中指定它们来执行此操作:

rsync -a --exclude=pattern_to_exclude source destination

如果您有要排除的指定模式,您可以使用 --include= 选项为匹配不同模式的文件覆盖该排除:

rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destination

最后,Rsync 的 --backup 选项可用于存储重要文件的备份。 它与 --backup-dir 选项一起使用,该选项指定应存储备份文件的目录:

rsync -a --delete --backup --backup-dir=/path/to/backups /path/to/source destination

结论

Rsync 可以简化通过网络连接的文件传输,并增加本地目录同步的稳健性。 Rsync 的灵活性使其成为许多不同文件级操作的理想选择。

掌握 Rsync 可以让您设计复杂的备份操作,并获得对传输方式和传输内容的细粒度控制。