1. 什么是 rsync

rsync 是一个提供快速增量文件传输的开源实用程序。

rsync 可以在本地与远程机器之间同步文件或目录,并且只传输已更改或新增的部分,从而大幅度减少数据传输的时间和带宽消耗。

本文仅介绍 rsync 的常用方法,个人认为已足够覆盖工作中的各类场景,更多高级功能读者可自行查阅 rsync 官方文档

2. rsync 的基本命令

官方文档中将 rsync 命令的使用分了三类:

1. 本地使用:

1
rsync [OPTION...] SRC... [DEST]

2. 通过远程 shell 访问:

1
2
3
4
Pull:
rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push:
rsync [OPTION...] SRC... [USER@]HOST:DEST

3. 通过 rsync daemon 访问(后面会具体说什么是 rsync daemon):

1
2
3
4
5
6
Pull:
rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push:
rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST)

注:

  1. 仅指定源参数 SRC 而不指定目的参数 DEST的用法将列出源文件而不是复制。
  2. ... 表示可以有多个值。OPTION... 表示可以有多个参数,这个是比较好理解的。SRC... 表示可以有多个源,rsync 是支持多个源路径的,即把多个源都同步到目的位置。当一行中指定了多个路径时,最后一个为目的路径,前面的全部为源路径(也就是说,是不可以同时指定多个源路径又不指定目的路径的,即不能同时列出多个源路径的内容,因为这样的话期望中的最后一个源路径会被识别为目的路径)。

下面分别说这三类使用方法,且本文的示例中仅包含唯一源的用法(多个源的场景较少,而且需要额外的注意力来保证程序达成预期的效果)。

3. 常用参数说明

下面列出了几个 rsync 的几个最常用的参数,这些参数已经足够日常的工作使用了。如果你有更高级的需求,请自行查阅 rsync 官方文档

其中 -a 参数几乎是在各个场景都会需要的,其他参数就可以根据场景需求来选择。

  • -a, --archive:”归档” 参数,用于实现文件的归档和同步。设定一个 -a,等于同时设定了 -rlptgoD 共 7 个参数。使用 -a 参数可以方便地实现归档和同步目录及其内容。它会尽力保留文件的各种属性和元数据,使得目标位置的文件尽可能地与源位置的文件相同。

    • -r, --recursive:递归地复制文件和目录,包括子目录。
    • -l, --links:保留符号链接。这会使得目标位置的链接与源位置的链接指向相同的目标。
    • -p, --perms:保留文件的权限。这会确保目标位置的文件与源位置的文件具有相同的访问权限。
    • -t, --times:保留文件的修改时间。目标位置的文件将具有与源位置的文件相同的最后修改时间。
    • -g, --group:保留文件的属组信息。这会使得目标位置的文件的属组与源位置的文件相同。
    • -o, --owner:保留文件的属主信息。这意味着目标位置的文件的所有者与源位置的文件相同。
    • -D:等价于同时设定参数 --devices--specials。即保留设备和特殊文件,如块设备和字符设备,以及 FIFO 和套接字。
      • --devices:保留设备文件。
      • --specials:保留特殊文件。
  • -v, --verbose:打印冗余信息。不设定此参数时 rsync 只会打印出传输出现问题的文件或目录的信息,设定此参数后 rsync 会输出所有传输的文件和目录的信息。

  • -c, --checksum:使用校验和判定文件是否修改,不设定此参数时(即默认时)rsync 通过修改时间和大小判断文件是否修改。

  • -z, --compress:压缩传输。在传输时使用压缩算法,减少网络带宽的使用。

  • -P:断点续传。在传输中保持文件的部分传输状态,如果传输被中断,可快速恢复传输。等价于同时设定参数 --partial--progress

    • --partial:保留部分传输的文件
    • --progress:显示传输进度。在传输过程中显示每个文件复制的进度。
  • --delete:删除目标中不存在的文件。确保目标目录与源目录内容保持一致。

  • --exclude:排除文件或目录。指定要排除的文件或目录的匹配模式(即支持正则),不进行复制。