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

介绍

Rsync,全称为远程同步,是一种远程和本地文件同步工具。它使用一种算法来最小化复制的数据量,只移动那些已更改的文件部分。

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

使用DigitalOcean应用平台从GitHub部署您的前端应用程序。让DigitalOcean专注于扩展您的应用。

先决条件

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

如果您计划按照此指南使用服务器,请明智地为它们设置管理用户并在每台服务器上配置防火墙。要设置这些服务器,请按照我们的初始服务器设置指南进行操作。

无论您使用何种类型的计算机来按照本教程操作,您都需要在两台计算机上创建SSH密钥。然后,按照该指南的第2步中概述的方式,将每台服务器的公钥复制到另一台服务器的authorized_keys文件中。

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

定义Rsync

Rsync是一个非常灵活的网络同步工具。由于它在Linux和类Unix系统上的普及以及作为系统脚本工具的流行,大多数Linux发行版默认都包含它。

了解Rsync语法

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

首先,通过运行以下命令进入您的主目录:

  1. cd ~

然后创建一个测试目录:

  1. mkdir dir1

再创建另一个测试目录:

  1. mkdir dir2

现在添加一些测试文件:

  1. touch dir1/file{1..100}

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

  1. ls dir1
Output
file1 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。要将 dir1 的内容同步到同一系统上的 dir2,您将运行 rsync 并使用 -r 标志,该标志代表“递归”并且对于目录同步是必需的:

  1. rsync -r dir1/ dir2

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

  1. rsync -a dir1/ dir2

请注意,在上述两个命令的语法中,第一个参数的末尾有一个尾随斜杠(/),在这里突出显示:

  1. rsync -a dir1/ dir2

此尾随斜杠表示 dir1 的内容。如果没有尾随斜杠,则 dir1,包括目录本身,将放置在 dir2 中。结果将创建以下层次结构:

~/dir2/dir1/[files]

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

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

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

  1. rsync -anv dir1 dir2
Output
sending 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文件夹同步到远程机器。请注意,在这种情况下,您要传输实际目录,因此您将省略尾随斜杠:

  1. rsync -a ~/dir1 username@remote_host:destination_directory

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

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

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

使用其他 Rsync 选项

Rsync 提供了许多选项来更改该实用程序的默认行为,例如您在前一节中学到的标志选项。

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

  1. rsync -az source destination

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

  1. rsync -azP source destination
Output
sending 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 利用修改时间来确定是否进行了更改的能力:

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

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

  1. touch dir1/file{1..10}

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

  1. rsync -azP source destination
Output
sending 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选项,执行测试以防止意外数据丢失:

  1. rsync -an --delete source destination

如果您希望排除同步目录中的特定文件或目录,可以通过在--exclude=选项后指定以逗号分隔的列表来实现:

  1. rsync -a --exclude=pattern_to_exclude source destination

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

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

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

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

结论

Rsync可以简化网络连接上的文件传输,并为本地目录同步增加鲁棒性。Rsync的灵活性使其成为许多不同文件级操作的良好选择。

A mastery of Rsync allows you to design complex backup operations and obtain fine-grained control over how and what is transferred.

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-rsync-to-sync-local-and-remote-directories