Rsync,这代表远程同步,是一款远程与本地文件同步工具。它使用一种算法,通过仅移动已更改的文件部分来最大程度地减少复制的数据量。
在本教程中,我们将定义 Rsync,回顾一下使用时的语法rsync
,解释如何使用 Rsync 与远程系统同步,以及其他可用选项。
为了练习使用rsync
要在本地和远程系统之间同步文件,您将需要两台计算机分别充当本地计算机和远程计算机。只要配置正确,这两台机器可以是虚拟专用服务器、虚拟机、容器或个人计算机。
如果您打算按照本指南使用服务器,那么谨慎的做法是为它们设置管理用户并在每个服务器上配置防火墙。要设置这些服务器,请按照我们的初始服务器设置指南.
无论您使用什么类型的计算机来学习本教程,您都需要在它们上创建 SSH 密钥。然后,将每台服务器的公钥复制到另一台服务器的公钥authorized_keys
文件中概述的该指南的第 2 步.
本指南在运行 Ubuntu 20.04 的计算机上进行了验证,尽管它通常应该适用于运行基于 Linux 的操作系统且具有以下功能的任何计算机:rsync
安装。
Rsync 是一个非常灵活的网络同步工具。由于它在 Linux 和类 Unix 系统上普遍存在,并且作为系统脚本工具很受欢迎,因此它默认包含在大多数 Linux 发行版中。
语法为rsync
操作方式与其他工具类似,例如ssh
, scp
, and cp
.
首先,通过运行以下命令更改到您的主目录:
然后创建一个测试目录:
创建另一个测试目录:
现在添加一些测试文件:
现在有一个名为dir1
其中有 100 个空文件。通过列出文件进行确认:
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
to dir2
在同一系统上,您将运行rsync
并使用-r
标志,代表“递归”,对于目录同步是必需的:
另一种选择是使用-a
flag,是一个组合标志,代表“archive”。该标志以递归方式同步并保留符号链接、特殊文件和设备文件、修改时间、组、所有者和权限。它比-r
并且 是推荐使用的标志。运行与上一个示例相同的命令,这次使用-a
flag:
请注意,末尾有一个斜杠 (/
) 位于前两个命令语法中第一个参数的末尾,并在此处突出显示:
这个尾部斜杠表示的内容dir1
。如果没有尾部斜杠,dir1
,包括目录,将被放置在dir2
。结果将创建如下所示的层次结构:
~/dir2/dir1/[files]
另一个技巧是在执行之前仔细检查你的参数rsync
命令。 Rsync 提供了一种通过传递-n
or --dry-run
选项。这-v
flag,意思是“详细”,也是获得适当输出所必需的。您将结合a
, n
, and v
以下命令中的标志:
Output
sending incremental file list
./
file1
file10
file100
file11
file12
file13
file14
file15
file16
file17
file18
. . .
现在将该输出与删除尾部斜杠时收到的输出进行比较,如下所示:
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
. . .
此输出现在表明目录本身已被传输,而不仅仅是目录中的文件。
To use 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
Like cp
和类似的工具一样,源始终是第一个参数,目的地始终是第二个。
Rsync 提供了许多用于更改实用程序默认行为的选项,例如您在上一节中了解的标志选项。
如果您要传输尚未压缩的文件(例如文本文件),则可以通过使用以下命令添加压缩来减少网络传输:-z
option:
-
rsync -az source destination
The -P
标志也很有帮助。它结合了标志--progress
and --partial
。第一个标志提供传输进度条,第二个标志允许您恢复中断的传输:
-
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 使用修改时间来确定是否已进行更改的能力:
-
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
假设您要使用如下命令更新某些文件的修改时间:
然后,如果你要跑rsync
with -azP
再次,您会在输出中注意到 Rsync 如何智能地仅重新复制已更改的文件:
-
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
, the --dry-run
选项,执行测试以防止不必要的数据丢失:
-
rsync -an --delete source destination
如果您希望排除正在同步的目录内的某些文件或目录,可以通过在以下位置后面的逗号分隔列表中指定它们来实现:--exclude=
option:
-
rsync -a --exclude=pattern_to_exclude source destination
如果您有要排除的指定模式,则可以使用以下命令覆盖与不同模式匹配的文件的排除项:--include=
option:
-
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 可以让您设计复杂的备份操作,并获得对传输方式和内容的细粒度控制。