rsync

远程数据同步与本地文件复制工具


语法格式

rsync [-aAbcdDEghHiIkKlLmnoOpPqrRtuvWX] [-f rule] [gnu-opts] srcs [dest]
rsync [-aA…WXz] [-B blksize] [-e cmd] [-f rule] [-T dir] [gnu-opts]
[user@]host:srcs [dest]
rsync [-aA…WXz] [-B blksize] [-e cmd] [-f rule] [-T dir] [gnu-opts]
srcs [user@]host:dest
rsync [-aA…WXz] [-B blksize] [-f rule] [-T dir] [gnu-opts]
[user@]host::srcs [dest]
rsync [-aA…WXz] [-B blksize] [-f rule] [-T dir] [gnu-opts]
rsync://[user@]host[:port]/srcs [dest]
rsync [-aA…WXz] [-B blksize] [-f rule] [-T dir] [gnu-opts]
srcs [user@]host::dest
rsync [-aA…WXz] [-B blksize] [-f rule] [-T dir] [gnu-opts]
srcs rsync://[user@]host[:port]/dest
rsync [-h|--help] [--version]

命令简介

rsync是一种通用的快速文件复制工具,能够在本地系统的不同目录之间复制文件,也可以利用远程Shell或rsync守护进程,在两个系统之间实现文件复制,采用下拉或推送方式,双向备份数据。

通常,sync采用“快速检测”算法,根据文件的大小与最近访问时间是否变化及指定的选项,确定文件是否需要复制、完整复制还是复制剩余部分、文件的其他属性变化是否需要维持等。

根据源文件与目的文件的差异,rsync命令通常采用增量传输的算法,减少网络传输的流量。目前,rsync广泛用于文件的备份与镜像,作为改善与增强的复制命令,成为每天必用的文件复制工具。

rsync命令提供大量的选项,用于控制文件复制的行为,包括文件的选择、文件属性的维持,以及链接文件的处理等。

rsync采用两种不同的方式与远程系统通信:采用远程Shell(如ssh或rsh)方式相互通信;通过TCP/IP访问rsync守护进程。只要主机名后面的源或目的路径名包含单个冒号“:”分隔符,即表示采用远程Shell方式。主机名后面的源或目的路径名包含两个冒号“:”分隔符,或当指定了“rsync://”形式的URL地址时,表示访问rsync服务器。

rsync命令的用法类似于rcp命令,必须指定源文件和目的文件,其中任何一个可以是远程或本地系统的文件。

上述第一种语法格式类似于cp与rcp命令,表示在本地系统内复制文件。其中srcs表示一个或一组源文件及目录,dest表示目的目录。实际上,只要源文件和目的文件参数的路径名不包含远程主机的名字或IP地址,就是在本地系统内复制文件。如果仅给出源文件参数srcs,而未给出目的文件参数dest,rsync只是列出源文件而已,不会复制文件。其效果相当于执行“ls -l”命令。

在指定源文件参数时,源路径名中的目录后面是否存在斜线字符,其意义是不同的。目录后面没有斜线字符表示复制目录本身及其中的文件,故需要在目的系统中创建一级或多级目录,把其中的文件复制到目的系统新建的目录中。如果存在斜线字符,表示仅把目录中的文件(不包括目录本身)复制到目的系统。但在任何情况下,都需要维持源目录的属性。例如,“rsync -av /src/foo /dest”与“rsync -av /src/foo/ /dest”命令的结果是不同的。前者表示把“/src/foo”整个目录及其中的文件递归地复制到/dest目录中(在/dest目录中创建src/foo子目录,然后把/src/foo目录中的文件复制到/dest/src/foo目录中)。后者表示把/src/foo目录中的文件(不包括src/foo目录)直接复制到/dest目录中。

第二种和第三种语法格式表示采用远程Shell方式在本地与远程系统之间复制文件。其中user是远程系统中的用户名,host是远程系统的主机名或IP地址,srcsdest的意义同上。第二种语法格式表示从远程系统到本地主机复制文件(也称下拉方式),第三种语法格式表示从本地主机到远程系统复制文件(也称推送方式)。

例如,“rsync -t *.c foo:src/”命令表示采用远程Shell方式,以推送方式,把当前目录中的C源码文件复制到远程系统foo的目的目录src中。“rsync -t foo:/script/ /script”命令表示以下拉方式,把远程系统foo的/script目录的脚本文件复制到本地主机的目的目录/script中。

当需要同时传输多个远程文件时,可以采用简化的语法格式,只需指定一次主机名,其他路径名可以省略主机名前缀。例如,“rsync -av host:file1 :file2 :file{3,4} /dest/”命令表示把远程系统中的file1、file2、file3和file4文件传输到本地主机的/dest目录中。

第四种至第七种语法格式表示访问rsync服务器,实现下拉方式(第四种和第五种语法格式)与推送方式(第六种和第七种语法格式)的文件复制。其中port是TCP端口号,userhostsrcsdest的意义同上。

当运程系统的rsync以后台方式运行时,可以通过TCP端口(默认的端口是873)直接访问rsync守护进程,采用双冒号的路径名或“rsync://”形式的URL地址,以下拉或推送的方式复制文件。如果仅指定了远程系统名但未指定源路径名参数,rsync守护进程将会列出远程系统当前目录中一系列可访问的文件。如果仅指定了远程系统名但未指定目的路径名参数,rsync守护进程将会列出一系列可访问的源文件。注意,此时不能使用“-e”选项。

命令选项

-a, --archive  创建档案文件模式。相当于同时指定了“-rlptgoD”多个选项。这是一种快速创建档案文件的方法,除了“-H”、“-A”与“-X”选项,几乎涵盖了复制文件需要用到的所有选项,如递归复制完整的目录,保持文件的时间属性等。注意,当与“--files-from”选项一起使用时,“-a”选项并不蕴含着“-r”选项,必要时需要单独指定。“-a”选项并不维护硬链接的文件。必要时需要单独指定“-H”选项。

-A, --acls  保持文件原有的ACL(蕴含着指定了“-p”选项)。

-b, --backup  在传输或删除文件之前,采用重新命名的方式,备份现有的目的文件。有关备份文件名的后缀与备份位置,参见“--suffix”与“--backup-dir”选项。

-B blksize, --block-size=blksize  强制rsync使用固定大小的数据块计算或传输文件。通常是基于每个需要更新的文件的大小确定的。

-c, --checksum  采用校验和替代默认的“快速检测”算法检查文件是否变动及文件是否需要传输。通常,rsync采用“快速算法”检测收发双方每个文件的大小和最后修改时间是否匹配。如果指定了这个选项,rsync将会针对收发双方的每个文件生成一个128位的校验和,通过比较校验和,确定文件是否变动及文件是否需要传输。由此可见,这将极大地降低文件传输的速度。

-d, --dirs  告诉发送方传输其遇到的任何目录。与“-r”选项不同,除非指定的目录名是句点或以斜线字符结束(如“.”、“dir/”或“dir/.”),不复制目录中的文件。如果未指定这个选项,也未指定“-r”选项,rsync将会跳过其遇到的所有目录(仅对每个目录输出一条信息而已)。如果同时指定了“-d”与“-r”选项,只有后者起作用。

-D  等同于“--devices”与“--specials”选项。

-e cmd, --rsh=cmd  选用指定的命令cmd作为远程Shell,以便本地与远程rsync之间通信用之。通常,rsync使用ssh进行通信。

-E, --executability  保持文件原有的可执行权限不变。

-f rule, --filter=rule  增加指定的过滤规则,从选定的传输文件中排除一定的文件。在递归传输文件时,这个选项是非常有用的。有关过滤规则的说明,详见rsync手册页。

-g, --group  保持文件原有的用户组属性。接收方需要以源文件的用户组属性为准,设置目的文件的用户组,保持双方相同。如果未指定这个选项,接收的文件按调用者的身份设置用户组。

-h, --human-readable  以容易阅读和理解的形式输出数值。当输出的数值较大时,可以加K、M或G等单位后缀。如果这个选项仅指定一次,单位是KB(1000)、MB(10002)和GB(10003);如果重复指定此选项,单位是K(1024)、M(10242)和G(10243)。

-H, --hard-links  传输文件时检查发送方是否存在硬链接的文件,当需要传输的文件为硬链接文件时,把硬链接的文件连接到接受方的相应文件中,保持文件的硬链接状态在源和目的系统中相同。如果未指定这个选项,将会按照单独的文件传输与存储硬链接的文件。

-i, --itemize-changes  逐一显示每个文件的变化,包括属性变化,其效果相当于指定了“--out-format=’%i %n%L’”选项。其中的“%i”由YXcstpoguax 形式的11个字符组成,Y表示更新类型(如“<”表示文件发送到远程主机,“>”表示文件传输到本地系统,c表示本地变化或创建目录等,以及“.”表示文件未更新等),X表示文件类型(如f表示文件,d表示目录,L表示符号链接文件,D表示设备文件,以及S表示套接字和管道文件等),其他字符表示修改的文件属性,详见rsync手册页。

-I, --ignore-times  通常,rsync会忽略具有相同大小和修改时间的任何文件。这个选项表示不管文件的大小和修改时间是否相同,所有的文件都需要更新。

-k, --copy-dirlinks  令发送方把指向目录的符号链接文件作为实际目录处理。

-K, --keep-dirlinks  令接收方把指向目录的符号链接文件作为实际目录处理(仅当匹配发送方的实际目录时)。如果未指定这个选项,删除接收方的符号链接文件,而代之以实际的目录。例如,假定传输一个目录foo,其中包含文件file,但foo是指向接收方的目录bar的符号链接文件。如果未指定这个选项,接收方将会删除符号链接文件foo,重建foo目录,把接收的文件置于新目录foo中;如果指定了这个选项,接收方将会保留符号链接文件,把文件file置于目录bar中。

-l, --links  当遇到符号链接文件时,仅复制符号链接文件本身。

-L, --copy-links  当遇到符号链接文件时,复制其引用的文件,而非符号链接文件本身。

-m, --prune-empty-dirs  在目的系统上,从接收的文件中剔除空目录或嵌套的空目录。

-n, --dry-run  试运行,实际上不做任何文件传输与复制,但会生成与实际运行几乎完全相同的信息。常见的用法是与“-v”一起使用,观察命令实际执行时能够产生什么效果。

-o, --owner  保持文件原有的属主属性(仅适用于超级用户)。接收方需要以源文件的属主属性为准,设置目的文件的属主,保持双方相同。如果未指定这个选项,接收的文件按调用者的身份设置文件属主。

-O, --omit-dir-times  在维持文件的修改时间时,忽略目录的修改时间,参见“--times”选项。

-p, --perms  保持文件原有的访问权限。接收方需要以源文件的访问权限为准,设置目的文件的访问权限,保持双方相同。

-P  等同于“--partial”与“--progress”选项。

-q, --quiet  禁止远程服务器输出非错误性的信息,减少文件传输过程中输出的信息量。适用于cron调用rsync。

-r, --recursive  递归地逐层遍历目录。参见“-d”选项。

-R, --relative  使用相对路径。这意味着把命令行中指定的完整路径名(而非最后的文件名部分)发送给服务器,作为相对路径名。当同时发送若干不同的目录,需要保持其完整的目录结构时,这个选项是特别有用的。例如,“rsync -av /foo/bar/baz.c remote:/tmp/”命令将会在远程服务器创建/tmp/baz.c文件。而“rsync -avR /foo/bar/baz.c remote:/tmp/”命令将会在远程服务器创建/tmp/foo/bar/baz.c文件,从而保持其完整的路径。

-t, --times  保持文件的修改时间不变。表示在传输文件数据的同时,也要传输文件的修改时间。

-T dir, --temp-dir=dir  在指定的目录中创建临时文件。

-u, --update  当目的系统中文件的修改时间比源文件的修改时间还新时,禁止传输与复制文件(如果源与目的文件的修改时间相同,但文件大小不同,仍需要更新文件)。

-v, --verbose  增加文件传输期间输出的信息量。通常,rsync运行期间输出的信息量较少。单个“-v”选项仅显示传输的文件信息和传输结束后的简要概括信息。多个“-v”选项将会给出更多的信息。

-W, --whole-file  复制整个文件(禁止使用差异算法)。

-X, --xattrs  保持文件原有的扩展属性。

-z, --compress  传输文件时压缩文件数据,从而减少传输的数据量。

--backup-dir=dir  与“--backup”选项组合使用时,在接收方的指定目录中存储所有的备份。这个选项可用于增量备份。此外还可以使用“--suffix”选项指定备份文件名后缀,否则存储在备份目录中的备份文件保持原来的文件名。

--bwlimit=kbps  限制I/O带宽(单位为每秒K字节)。

--chmod=chmod  使用一个或多个由逗号分隔的chmod命令的符号方式设置传输文件的访问权限。除了chmod命令的u、g、o和a之外,还可以使用D表示目录,F表示文件。例如,“--chmod=Dg+s,ug+w,Fo-w”选项。

--compress-level=num  明确设置传输文件时采用的压缩级别。

--copy-unsafe-links  复制指向欲复制的目录层次结构之外的任何符号链接文件。

--delay-updates  针对需要更新的每个文件,在单独的目录中创建临时文件,直至传输结束,再统一把临时文件重新命名为目的目录中的文件,以替代原来的文件。

--delete  从目的目录中删除接收方存在但发送方已不存在的无关紧要的文件。前提是,复制的必须是整个目录,如“dir”或“dir/”,不能使用通配符指定目录中的文件,如“dir/file*”。

--delete-after  接收方在文件传输完成之后删除目录中的目的文件。

--delete-before  接收方在文件开始传输之前删除系统中的目的文件。当接收方存储空间比较紧张时,可以选择这个选项。这也是rsync默认的做法。

--delete-delay  类似于“--delete-after”选项,当与“--delay-updates”等选项组合使用时更有效。

--delete-during, --del  接收方在文件传输期间删除目录中的目的文件。

--delete-excluded  除了从目的目录中删除接收方存在但发送方不存在的文件之外,还要从接收方的目的目录中删除已排除的文件。

--devices  传输字符和块设备文件,从而创建相应的文件(仅适用于接收方的超级用户)。

--existing, --ignore-non-existing  如果目的系统中不存在,禁止在接收方创建新的文件或目录。如果与“--ignore-existing”选项一起使用,不会更新任何文件。

--exclude=pattern  指定需要排除的文件名模式,表示不传输匹配的文件。

--exclude-from=file  从指定的文件中读取需要排除的文件名模式,在传输文件时剔除匹配的文件。

--files-from=file  按照指定文件严格定义的文件列表,传输需要传输的源文件。

--force  强制删除目录,即使目录非空。

--ignore-errors  当指定了“--delete”选项删除文件时,即使出现I/O错误,也继续执行文件的删除操作。

--ignore-existing  禁止更新目的系统中已经存在的文件。

--include=pattern  指定需要包含的文件名模式,表示应传输匹配的文件。

--include-from=file  从指定的文件中读取需要包含的文件名模式,传输匹配的文件。

--inplace  就地更新目的文件。通常,当文件需要更新时,rsync首先创建新的文件副本,当传输完成时,再用新建的文件取代目的文件,而不是直接更新目的文件。

--list-only  显示源文件列表。在指定源文件参数时,可以指定一个或多个源文件,也可以使用通配符。

--log-file=file  使用指定的文件作为文件传输的日志文件。

--log-file-format=fmt  使用指定的格式和传输的文件更新日志文件。如果使用“--log-file”选项指定了日志文件,而未指定这个选项,默认的格式是“%i %n%L”(显示文件的序号、文件的名字,如果文件是一个符号连接文件,显示其指向的文件)。至于其他可用的格式字符,参见rsyncd.conf手册页。

--max-delete=num  禁止删除超过指定数量的文件或目录。如果删除的文件超过此限,rsync将会输出警告信息,然后终止执行。

--max-size=size  避免传输大于指定容量的文件。size是一个整数或浮点数,表示字节数。也可以加K(1024)、M(10242)或G(10243)以及KB(1000)、MB(10002)或GB(10003)等单位后缀。

--min-size=size  禁止传输小于指定容量的文件。size的意义与用法同上。

--modify-window=num  使用指定的误差比较文件的修改时间。当比较两个文件的修改时间时,rsync使用指定的值(单位为秒)作为误差范围,只要其误差值不超过这个范围,即认为两者是相等的。通常,这个误差值是0,表示恰好匹配。但有时使用一个误差范围可能更有实际意义。

--no-option  通过在选项名字前面加“no-”前缀,可以关闭一个或多个蕴含的选项。并非所有的选项都能加“no-”前缀,只有其他选项蕴含的选项(如“--no-perms”选项等)或在不同情况下具有不同默认值的选项(如“--no-dirs”选项等)才能加“no-”前缀。在“no-”前缀后面,指定的选项可以是常规选项,如“--no-R”,也可以是GNU长选项,如“--no-relative”。例如,若想使用“-a”选项,但不想使用“-o”选项,则无须把“-a”转换成“-rlptgD”选项,只需指定“-a --no-o”选项即可。注意,选项的顺序是重要的,“--no-r -a”与“-a --no-r”选项是不同的,前者中的“-r”不起作用,后者中的“-r”选项抵消了“-a”选项中的“-r”选项。

--no-implied-dirs  用于调整“--relative”选项的默认处理方式。当指定了这个选项时,传输时不包括源文件名参数中蕴含的目录。这意味着,目的系统中的相应路径如果存在则保持不变,如果不存在,使用默认的属性创建缺失的路径。

--numeric-ids  禁止把用户ID和用户组ID映射到相应的用户名和用户组名。如果指定了这个选项,rsync将会传输用户ID和用户组ID而不是用户名和用户组名,之后把ID映射到用户名或用户组名(用户ID 0和用户组ID 0除外)。通常,rsync使用用户名和用户组名确定文件的归属。如果目的系统不存在对应于数字ID的用户名或用户组名,则直接使用来自源系统的数字ID。

--out-format=fmt  使用指定的格式显示传输的文件。如果同时指定了“-v”选项,默认的格式是“%n%L”(显示文件的名字,如果文件是一个符号连接文件,显示其指向的文件)。

--partial  保留传输不完整的文件,以便随后继续传输剩余的部分,加快文件的传输。通常,如果传输中断,rsync会删除传输不完整的文件。

--partial-dir=dir  把传输不完整的文件置于指定的目录。在下一次传输时,rsync会检查这个目录,恢复、续传其中的文件,从而加快文件传输的速度。

--password-file=file  指定一个文件,其中含有访问rsync守护进程的密码。

--port=port  指定访问rsync守护进程时使用的TCP端口号,默认的端口号是873。

--progress  显示文件传输的进度,包括接收的字节数、完成的百分比、传输的速度和耗时等信息。蕴含着同时指定了“-v”选项。

--remove-source-files  在发送方的系统中删除已成功复制到接收方的源文件(不包括目录)。

--rsync-path=prog  指定在远处系统中运行哪个程序(如脚本或rsync命令本身)从而启动rsync。仅当rsync命令位于默认的命令检索路径之外时才需要使用这个选项,如“--rsync-path=/usr/local/bin/rsync”。

--safe-links  忽略指向欲复制目录层次结构之外的任何符号链接文件。注意,与“--relative”选项组合使用时可能会产生无法预料的结果。

--size-only    仅仅复制文件大小发生变化的文件。

--skip-compress=list  禁止压缩具有参数表中指定文件名后缀的文件。其中list是一个或多个文件名后缀(省略句点“.”),中间加斜线“/”分隔符。

--specials  传输特殊文件,如套接字和管道文件。

--stats  输出文件传输的详细统计信息,其中包括:文件(包括目录和符号链接文件等)的总和、常规文件(不包括目录和符号链接文件)更新的数量、所有文件(不包括目录和特殊文件,但包括符号链接文件)容量的总和以及实际传输的文件容量的总和等。

--suffix=suffix  指定备份文件名后缀。使用指定的备份文件名后缀强制替代“-b”选项指定的默认文件名后缀。如果未指定“--backup-dir”选项,默认的备份文件名后缀是“~”,否则是一个空串。

--super  即使运行rsync的不是超级用户,接收方仍然尝试采用超级用户的处理方式,其中包括通过“--owner”选项维持用户属性,通过“--groups”选项维持用户组属性,以及通过“--devices”选项复制设备文件等。

--timeout=seconds  设置最大的I/O超时值(单位为秒)。如果超过指定的时间仍没有传输数据,rsync将会终止运行。默认值是0,表示没有超时的限制。

-0, --from0  读取文件中的规则或文件名时,指定其中采用的分隔符是NULL字符“\0”,而非换行符、回车符或回车与换行符的组合。

-4, --ipv4  采用IPv4协议。

-6, --ipv6  采用IPv6协议。

应用实例

1. 在本地主机上,把/script目录中的文件(包括子目录)递归复制到/home/gqxing/script目录中。

$ rsync -av /script /home/gqxing/script

2. 采用下拉方式,把远程系统foo上/src/c目录中的文件传输到本地主机的/home/gqxing/src目录。确保符号链接文件、文件的访问权限与属主等文件属性在传输后得以维持。

$ rsync -av foo:/src/c /home/gqxing/src

3. 采用推送方式,把本地主机/data/目录中的文件递归地传输到远程系统foo的/backup目录中。同时采用压缩的方式,减少传输的数据量,提高文件传输的速度。

$ rsync -avz /data/ foo:/backup

索引:A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z