「rsync(1)」- 一种快速,多功能,远程(和本地)文件复制工具

常用命令

通过 SSH 进行文件同步,而无需远程部署 rsync 服务:

rsync -avz -e 'ssh -i /path/to/id_rsa' /path/to/src root@hostname:/path/to/dest

快速完成文件同步:

rsync -r --size-only /src /dest # 即,文件大小不同,则进行同步

同步文件,但是无需同步时间:

rsync -r --no-times /src /dest

如果想并行传输以充分利用带宽,建议使用 parallel 或 xargs 等命令:

ls /srv/mail | xargs -n1 -P4 -I% rsync -Pa % myserver.com:/srv/mail/

补充说明:
1)目前,暂时无法指定 rsync 同步文件的顺序。

语法格式

Local:  
	rsync [OPTION...] SRC... [DEST]

Access via remote shell:
 Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
 Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

Access via rsync daemon:
 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

仅使用一个SRC参数,且没有DEST参数的用法,将列出源文件,而不是复制。

命令描述

Rsync是一个快速、灵活的文件复制工具。通过远程Shell或者Rsync守护进程,可以从另一台主机上拉取文件,或者向另一台主机发送文件,也可以在本地进行文件复制。Rsync提供了大量的选项用于控制其行为的各个方面,并可以对要复制的文件进行非常灵活的控制。它以差异传输算法著称,该算法发送源文件与目的文件的差异,以此来减少在网络上发送的数据量。Rsync广泛的用于备份、镜像及作为一种改进的日常使用copy命令。

Rsync使用“快速检查”算法(默认情况下)查找需要传输的文件,该算法查找大小或上次修改时间发生变化的文件。 当”快速检查“表明不需要更新文件的数据时,对其他保留属性(由选项请求)的任何更改,将直接在目的文件上进行。

Rsync将文件复制到远程主机,或从远程主机复制文件;或在当前主机上本地复制文件(它不支持在两个远程主机之间复制文件)。

其他特征有哪些?

  1. rsync使用“快速检查”算法(默认)来查找大小发生改变或者修改时间变化的文件。当“快速检查”表明文件数据不需要进行更新的时候,其他保留的属性(由命令选项要求的属性)的改变会在目标文件上直接进行。
  2. 支持复制链接、设备、属主、属组、权限。
  3. 排除、从选项中排除类似与GNU的tar。
  4. CVS排除模式(忽略与CVS忽略的相同文件)。
  5. 可以使用任何透明的远程Shell,包括ssh或者rsh。
  6. 不要求超级用户权限。
  7. 将文件传输流水线化以最小化延迟成本。
  8. 支持匿名和认证式Rsync服务。

使用场景

  1. 对现有的数据进行备份
    1. 配置cron,可以对文件进行定时备份。
    2. 配置inotify,可以对变更的文件进行实时同步。

  1. 支持匿名传输,可以对资源网站进行镜像
    1. 比如:rsync rsync://rsync.mirrors.ustc.edu.cn,该命令可以对科大镜像站进行镜像,但实际上该命令只是列出了所有的模块,后面的章节会讲解具体的语法。

  1. 对文件进行同步
    1. 站点同步。WEB负载均衡时,将主机的代码同步到其他服务器。rsync -r website rsync://rsync.d3rm.org/website,该命令会将website推到远程Rsync守护进程的example模块下。

工作方式

在Rsync中,有两种不同的方式来访问远程系统:

作为一种特殊情况,如果指定单个SRC参数,而没有DEST,则文件将会以类似于“ls -l”的输出格式列出。

正如所料,如果SRC或DEST都未指定远程主机,则复制在本地进行(另请参阅–list-only选项)。

Rsync将本地端称为“客户端(Client)”,将远程端称为“服务端(Server)”。不要将“Server”与rsync守护进程混淆 – 守护进程始终是”Server“,但”Server“可以是守护进程或远程Shell生成进程。

处理Rsync客户端请求的服务端有三种:

  • Inetd。使用inetd生成Rsync守护进程。
  • 远程Shell。比如,可以通过ssh建立隧道对文件进行传输。这种情况下,不需要在远程创建Rsync守护进程。
  • Rsync守护进程。在远程服务器上,搭建Rsync守护进程,监听873端口,然后本地通过Rsync命令向远程的Rsync守护进程发送文件、或者拉取文件到本地。

作为Rsync传输的两端,可以有以下三种组合:

  • 本地到本地(复制)。
  • 本地到远程(推送)。
  • 远程到本地(拉去)。

注意事项:Rsync不支持远程和远程之间传输文件。

安装

有关安装说明,请参阅文件README。

安装后,您可以将rsync用于可以通过远程shell访问的任何计算机(以及可以使用rsync守护进程模式协议访问的计算机)。对于远程传输,现代rsync使用ssh进行通信,但它可能已配置为默认使用不同的远程Shell,例如rsh或remsh。您还可以使用-e命令行选项,或通过设置Rsync_RSH环境变量来指定您喜欢的任何远程shell。

请注意,必须在源计算机和目标计算机上安装rsync。

启动Rsync服务以接受连接

为了连接到Rsync守护进程,远程系统需要已经运行一个守护进程(或者它需要配置类似inetd的东西,来为特定端口上的传入连接生成rsync守护进程)。有关如何启动将处理传入套接字连接的守护进程的完整信息,请参阅rsyncd.conf(5)手册页 – 这是守护进程的配置文件,它包含有关如何运行守护进程的完整详细信息(包括独立rsync服务和inetd配置)。

如果您使用其中一个远程shell传输进行传输,则无需手动启动Rsync守护进程。

连接到Rsync守护进程

也可以使用没有远程Shell的rsync作为传输。 在这种情况下,您将直接连接到远程Rsync守护进程,通常使用TCP端口873.(这显然需要Rsync守护进程在远程系统上运行,因此请参阅下面的”STARTING AN Rsync DAEMON TO ACCEPT CONNECTIONS“部分,以获取有关Rsync服务搭建的信息。):

从远程拉取文件到本地
rsync [OPTION…] [USER@]HOST::SRC… [DEST]rsync [OPTION…] rsync//:[USER@]HOST[:PORT]/SRC… [DEST]

从本地推送文件到远程
rsync [OPTION…] SRC… [USER@]HOST::DESTrsync [OPTION…] SRC… rsync//:[USER@]HOST[:PORT]/DEST

如上命令,推送和拉取命令都分为三部分:

(1)命令选项,即[OPTIONS]。

(2)源地址。如`[SRC...]‘、`rsync://[USER@]HOST[:PORT]/SRC...

(3)目的地址。如`[DEST]‘、`rsync://[USER@]HOST[:PORT]/DEST

对于拉取文件,源地址可以为一个或多个远程URL,而目的地址只能为一个本地路径。对于推送文件,源地址可以为一个或多个本地路径,而目的地址只能为一个远程URL。

以这种方式使用rsync与使用远程Shell相同,除了:

  • 使用双冒号(::)将主机名与路径分开,而不是单个冒号;或者使用`rsync://URL’。
  • ”path”的第一个字实际上是模块名称。
  • 远程守护进程可能会在您连接时打印当天的消息。
  • 如果在远程守护进程上未指定路径名,则将显示守护进程上的可访问路径列表。
  • 如果未指定DEST,则会提供远程守护进程上指定文件的列表。
  • 不能指定–rsh(-e)选项。

复制名为“src”的远程模块中的所有文件的示例:

# rsync -av host::src /dest

远程Rsync守护进程上的某些模块可能需要身份验证。如果是这样,您将在连接时收到密码提示。您可以通过将环境变量Rsync_PASSWORD设置为要使用的密码,或使用–password-file选项来避免密码提示。在编写rsync脚本时,这可能很有用。警告:在某些系统上,所有用户都可以看到环境变量,因此在这些系统上推荐使用–password-file选项。

您可以通过将环境变量Rsync_PROXY设置为指向Web代理的hostname:port对,通过Web代理建立连接。 请注意,Web代理的配置必须支持到端口873的代理连接。

您还可以使用指定程序作为代理,来建立守护进程连接。方法是将环境变量Rsync_CONNECT_PROG设置为您希望运行的命令,而不是进行直接套接字连接。 该字符串可能包含转义符“%H”以表示rsync命令中指定的主机名(因此,如果字符串中需要单个“%”,请使用“%%”)。 例如:

# export Rsync_CONNECT_PROG=’ssh proxyhost nc %H 873′

# rsync -av targethost1::module/src/ /dest/

# rsync -av rsync:://targethost2/module/src/ /dest/

上面指定的命令使用ssh在主机proxyhost上运行nc(netcat),它将所有数据转发到targethost(%H)上的873端口(rsync守护进程)。

使用Rsync守护进程功能:通过远程Shell连接

有时可以使用rsync守护程序的各种功能(例如命名模块)而不实际允许任何新的套接字连接进入系统(除了允许远程shell访问所需的功能之外)。 Rsync支持使用远程Shell连接到主机,然后生成一次性“守护进程”服务器,该服务器希望在远程用户的主目录中读取其配置文件。如果要加密”守护程序风格“传输的数据,这可能很有用,但由于守护程序是由远程用户重新启动的,因此您可能无法使用chroot等功能或更改守护程序使用的uid。 (对于加密守护程序传输的另一种方法,请考虑使用SSH将本地端口隧道连接到远程计算机,并在该远程主机上配置普通rsync守护程序,以仅允许来自“localhost”的连接。)

从用户的角度来看,通过远程Shell连接进行的守护进程传输使用与普通rsync-daemon传输几乎相同的命令行语法,唯一的例外是您必须在命令行上使用–rsh=COMMAND选项来显式设置远程shell程序(在环境中设置Rsync_RSH不会启用此功能。)。例如:

# rsync -av –rsh=ssh host::module /dest

如果需要指定其他远程shell用户,请记住主机前面的user@前缀是指定rsync-user值(对于需要基于用户的身份验证的模块)。这意味着在指定remote-shell时必须为ssh指定’-l user’选项,如此示例中使用–rsh选项的短版本:

# rsync -av -e “ssh -l ssh-user” rsync-user@host::module /dest

参数“ssh-user”将在ssh级别使用;参数“rsync-user”将用于登录rync服务的“module”模块。

传输排序

Rsync始终将指定的文件名排序到其内部传输列表中。 这将处理同名目录的内容合并,使删除重复文件名变得容易。当文件以与命令行中给出的顺序不同的顺序传输时,可能会使某人感到困惑。

如果您需要先将文件转移到另一个文件中,请将文件分成不同的rsync调用,或者考虑使用–delay-updates(这不会影响已排序的传输顺序,但确实会使最终的文件更新阶段发生得更快)。

命令选项概览

以下是rsync中可用选项的简短摘要。

-v, --verbose		显示更多信息。
--info=FLAGS            显示更细粒度的信息。
--debug=FLAGS           显示细粒度的debug信息。
--msgs2stderr           指定输出用于调试。
-q, --quiet		抑制非错误信息。
--no-motd               抑制daemon模式的MOTD(参考caveat)。
-c, --checksum		跳过基于校验和的检查,非修改时间和大小。
-a, --archive		archive模式;等价于-rlptgoD(无-H,-A,-X)。
--no-OPTION		关闭隐含的OPTIONS(比如:--no-D)。
-r, --recursive		递归进入目录。
-R, --relative		使用相对路径名。
--no-implied-dirs       和--relative一起不发送隐含目录。
-b, --backup		创建备份。参考--suffix与--backup-dir。
--backup-dir=DIR	将备份备份到DIR的层次结构中。
--suffix=SUFFIX		备份后缀。默认:~ w/o --backup-dir
-u, --update		跳过接收端更新的文件。
--inplace		更新目标文件。
--append		将数据附加到较短的文件。
--append-verify		追加w/old数据到文件校验和中。
-d, --dirs		无需反复转移目录。
-l, --links		作为链接复制链接。
-L, --copy-links	变换连接到相关的目录/文件。
--copy-unsafe-links	仅变换不安全的链接。
--safe-links		忽略指向树之外的符号链接。
--munge-links		显示符号链接使他们更安全。
-k, --copy-dirlinks	变换符号链接到目录指向的目录。
-K, --keep-dirlinks	将接收端的链接的目录视为目录。
-H, --hard-links	保留硬连接。
-p, --perms		保留权限。
-E, --executability	保留执行能力。
--chmod=CHMOD		修改文件或者目录的权限。
-A, --acls		保留ACL,暗含了-p选项。
-X, --xattrs		保留扩展属性。
-o, --owner		保留所属用户。(只有超级用户)
-g, --group		保留组。
--devices		保留设备文件。(只有超级用户)
--specials		保留特殊文件。
-D			等价与--devices --specials
-t, --times		保留修改时间。
-O, --omit-dir-times	忽略从--times开始的目录。
-J, --omit-link-times	忽略从--times开始的符号链接。
--super			接收方尝试超级用户活动。
--fake-super		使用xattrs存储/恢复特权属性。
-S, --sparse		高效处理稀疏文件。
--preallocate		写之前先分配的目标文件。
-n, --dry-run		进行试运行,不作任何更改。
-W, --whole-file	复制整个文件。(w/o delta-xfer算法)
-x, --one-file-system	不跨越文件系统边界。
-B, --block-size=SIZE	强制固定校验和块大校。
-e, --rsh=COMMAND	指定使用的远程shell。
--rsync-path=PROGRAM	指定远程主机要运行的rsync。
--existing		在接收端跳过创建新文件。
--ignore-existing	跳过接收端已经存在的文件。
--remove-source-files	发送端移除已经同步的文件。
--del			--delete-during的别名。
--delete		删除目标文件中的多余文件。
--delete-before		接收端在xfer前删除,不止执行期间。
--delete-during		接收端在传输期间删除。
--delete-delay		传输期间查找,结束后删除。
--delete-after		接收端在传输结束后删除,而不时传输期间。
--delete-excluded 	同时从DEST目录中删除不包含文件。
--ignore-missing-args	忽略缺失的源参数,不产生错误。
--delete-missing-args	从目的中删除缺少的源参数。
--ignore-errors		即使有I/O错误,也执行删除。
--force			强制删除目录,即使目录不为空。
--max-delete=NUM	删除文件时不要超过NUM个文件。
--max-size=SIZE		不要传输大小超过SIZE的任何文件。
--min-size=SIZE		不要传输大小小于SIZE的任何文件。
--partial		保留部分传输文件。
--partial-dir=DIR	将部分传输的文件放入DIR中。
--delay-updates		把所有更新的文件放在最后。
-m, --prune-empty-dirs	从文件列表中删除空目录链 。
--numeric-ids		不要通过user/group名来映射uid/gid。
--usermap=STRING	自定义用户名映射。
--groupmap=STRING	自定义组名映射。
--chown=USER:GROUP	简单的用户名/组名映射。
--timeout=SECONDS	以秒为单位设置I/O超时。
--contimeout=SECONDS	以秒为单位设置守护进程连接超时。
-I, --ignore-times	不要跳过匹配大小和时间的文件。
--size-only		跳过大小匹配的文件。
--modify-window=NUM	通过减小精准度来比较修改时间。
-T, --temp-dir=DIR	在DIR目录中创建临时文件。
-y, --fuzzy		如果没有目标文件,则查找相似文件。
--compare-dest=DIR	同时相对于DIR比较接收文件。
--copy-dest=DIR         并包含未更改文件的副本。
--link-dest=DIR		当没有改变的时候,硬连接到DIR中的文件。
-z, --compress		传输期间压缩文件数据。
--compress-level=NUM	显式的设置压缩级别。
--skip-compress=LIST	跳过以LIST中为后缀的文件的压缩。
-C, --cvs-exclude	以CVS方式自动忽略文件。
-f, --filter=RULE	添加一个文件过滤RULE。
-F			等同于--filter='dir-merge /.rsync-filter'
                        重复: --filter='- .rsync-filter'
--exclude=PATTERN	排除匹配PATTERN的文件。
--exclude-from=FILE	从文件中读取排除规则。
--include=PATTERN	不排除包含PATTERN的文件。
--include-from=FILE	从文件中读取包含模式。
--files-from=FILE	从文件中度与源文件名。
-0, --from0		所有的过滤文件由0分隔。
-s, --protect-args	无空格分隔;只有通配字符。
--address=ADDRESS	用于连接服务的IP地址。
--port=PORT		指定双冒号代替端口号。
--sockopts=OPTIONS	指定自定义的TCP选项。
--blocking-io		为远程shell使用阻塞I/O。
--outbuf=N|L|B		设置输出缓冲为None, Line, Block。
--stats			给出某些文件传输状态。
-8, --8-bit-output	输出中没有高位字符。
-h, --human-readable	以人类可读格式输出数字。
--progress		传输期间显示进度。
-P			等同于--partial --progress
-i, --itemize-changes	为所有的更新输出修改描述。
-M, --remote-option=OPTION	发送OPTION到远程端。
--out-format=FORMAT	以FORMAT指定的格式输出更新。
--log-file=FILE		将执行的操作的日志写入FILE文件。
--log-file-format=FMT	以FMT指定的格式来记录更新。
--password-file=FILE	从FILE读取守护进程的访问密码。
--list-only		列出文件而不是复制。
--bwlimit=RATE		显示I/O带宽。
--stop-at=y-m-dTh:m	在year-month-dayThour:minute时停止rsync。
--time-limit=MINS	在MINS分钟后停止rsync。
--write-batch=FILE	将批量更新写入FILE。
--only-write-batch=FILE	像--write-batch,但是w/o更新目的地址。
--read-batch=FILE	从FILE读取批量更新。
--protocol=NUM		强制指定旧版本协议。
--iconv=CONVERT_SPEC	对文件名要求字符集转换。
--checksum-seed=NUM     设置block/file校验和种子(高级)。
-4, --ipv4		执行IPv4。
-6, --ipv6		执行IPv6。
--version		打印版本号。
(-h) --help		显示帮助信息

Rsync也可以作为守护进程运行,在这种情况下,接受以下选项:

--daemon                以守护进程的方式运行rsync。
--address=ADDRESS       绑定到指定的地址。
--bwlimit=RATE          限制套解字I/O的带宽。
--config=FILE           指定要使用的rsyncd.conf配置文件。
-M, --dparam=OVERRIDE   重写全局的守护进程配置参数。
--no-detach             不要脱离父进程。
--port=PORT             指定监听的端口号。
--log-file=FILE         覆盖"log file"的设置。
--log-file-format=FMT   覆盖"log format"的设置。
--sockopts=OPTIONS      设置自定义的TCP选项。
-v, --verbose           增加输出的详细信息。
-4, --ipv4              使用IPv4。
-6, --ipv6              使用IPv6。
-h, --help              显示该帮助信息(要用在--daemon选项后面)。

有关完整说明,请参阅下面的详细说明。

命令支持的选项及含义:客户端选项

rsync既支持长选项,也支持短选项,但有些选项只有长选项,没有短选项。长选项的参数,对于短选项也是必须的(即使下面在短选项中没有列出)。下面描述了选项的详细含义。如果一个选项可以用多种方式指定,则选项之间使用逗号分割。指定参数的时候可以使用–option=param格式,也可以使用–option param格式。为了避免某些选项的参数被Shell解释,需要对其进行引用。注意,如果波浪线(~)需要shell进行解析,应该使用–option ~/foo的形式,即不加等号,而–option=~/foo并不会被shell解析,。

–info=FLAGS
通过此选项,可以对要查看的信息输出进行细化控制。一个单独的标志名称可能后跟一个级别编号,其中0表示无声输出,1表示默认输出级别,更高的数字表示该增加标志的输出(对于支持更高级别的输出)。使用–info=help来查看所有可用的标志名称、它们输出的内容、对于在详细级别中的每次增加都添加了什么标志名称。例如:

rsync -a –info=progress2 src/ dest/

rsync -avv –info=stats2,misc1,flist0 src/ dest/

注意:–info=name的输出受–out-format和–itemize-changes(-i)选项的影响。有关详细内容可以查看这些选项。

该选项被添加到了3.1.0,因此旧版本的服务端可能会拒绝细粒度的请求(如果一个或多个标志需要被发送到服务器并且服务端太久以至于无法理解它们)。处理守护进程时,参阅”max verbosity”中的警告。

–debug=FLAGS
可以细粒度的控制debug的输出。一个单独的标志名称可能后跟一个级别编号,其中0表示无声输出,1表示默认输出级别,更高的数字表示该增加标志的输出(对于支持更高级别的输出)。使用–debug=help来查看所有可用的标志名称、它们输出的内容、对于在详细级别中的每次增加都添加了什么标志名称。例如:

rsync -avvv –debug=none src/ dest/

rsync -avA –del –debug=del2,acl src/ dest/

注意:某些debug信息只有在–msgs2stderr指定时才会输出,特别是那些属于I/O和缓冲区的调试。

该选项被添加到了3.1.0,因此旧版本的服务端可能会拒绝细粒度的请求(如果一个或多个标志需要被发送到服务器并且服务端太久以至于无法理解它们)。处理守护进程时,参阅”max verbosity”中的警告。

–msgs2stderr
此选项更改rsync,以将其所有输出直接发送到stderr,而不是通过协议(通常通过stdout输出信息消息)将消息发送到客户端。这主要用于调试,以避免更改通过协议发送的数据,因为额外的协议数据可能会改变正在测试的内容。不使用–remote-option时,该选项不会影响传输的远程端。另外请记住,守护进程连接没有stderr通道将消息发送回客户端,所以如果你正在使用此选项进行任何守护进程传输调试,则应该使用–no-detach启动守护进程 并在守护程序端看到stderr输出。

此选项具有使stderr输出获得行缓冲的副作用,以便以更易读的方式合并3个程序的输出。

-q, –quiet
此选项可减少传输过程中提供的信息量,特别是抑制来自远程服务器的信息消息。从cron调用rsync时,此选项很有用。

–no-motd
该选项影响客户端在守护进程传输开始时输出的信息。这会抑制当前消息(MOTD)文本,但它也会影响守护程序为响应“rsync host ::”请求而发送的模块列表(由于rsync协议的限制),所以如果想要从守护进程中请求模块列表,请省略此选项。

-I, –ignore-times
通常情况下,rsync会跳过那些大小相同、修改时间相同的文件。使用该选项后,会关闭”快速检查“行为,导致所有的文件被更新。

–size-only
这修改了rsync的“快速检查”算法,用于查找需要传输的文件,将其从缺省的传输文件(其大小已更改或上次修改时间已更改)更改为仅查找大小已更改的文件。在使用另一个可能无法准确保存时间戳的镜像系统后开始使用rsync时,这很有用。

–modify-window
比较两个时间戳时,如果时间戳相差不超过修改窗口值,则rsync会将时间戳视为相等。这通常是0(完全匹配),但是在某些情况下,你可能会发现将它设置为更大的值会很有用。特别是,当转移到或从MS Windows FAT文件系统(代表2秒分辨率的时间)时,–modify-window=1是有用的(允许时间相差达1秒)。

-c, –checksum
这改变了rsync检查文件是否已被更改并需要传输的方式。如果没有这个选项,rsync使用“快速检查”(缺省情况下)检查发送者和接收者之间的每个文件的大小和上次修改的时间是否匹配。此选项将更改此值,以比较每个具有匹配大小的文件的128位校验和。生成校验和意味着双方将花费大量磁盘I/O读取传输文件中的所有数据(并且这是在传输已更改文件的任何读取之前),因此这会降低速度显著。

发送端在执行文件系统扫描以生成可用文件的列表时生成校验和。接收端在扫描更改的文件时生成校验和,并与发送端对应的相同大小的文件进行校验:大小或校验更改的文件都会被选择并用于传输。

注意,rsync通过检查在传输文件时生成的整个文件校验和来验证每个传输的文件是否在接收端正确重建,但是自动传输后验证与此选项的传输前检查无关。

协议30及以上(3.0.0首次支持),校验和使用md5。旧版本的协议使用md4。

-a, –archive
等价于-rlptgoD。这是一种快速递归选项的方法,并且想要保存几乎所有的东西(-H是一个显着的省略)。上述等价的唯一例外是当指定了–files-from时,在这种情况下不指定-r。

请注意,-a不保留硬链接(应为没有使用-H选项),因为查找多链接的文件代价非常昂贵。必须单独指定-H。

–no-OPTION
可以给选项添加no-前缀来关闭选项。不是所有的选项都支持no-前缀:只有被其他选项隐含的选项(比如:–no-D, –no-perms)或者在各种情况下有不同的默认值(–no-whole-file, –no-blocking-io, –no-dirs)才可以。可以在no-后指定长选项,也可以指定短选项(比如:–no-R等价与–no-relative)。

例如: 你想使用-a选项,但是不想使用-o,除了将-a改为-rlptgD外,还可以使用-a –no-o或者-a –no-owner。

选项的顺序是很重要的:如果你指定了–no-r -a,那么-r选项最后还是会被打开,与之相反的是-a –no-r。还要注意,–files-from选项的副作用是位置无关的,因为它会影响几个选项的默认状态,并略微改变-a的含义(有关更多详细信息,请参阅–files-from选项)。

-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的文件,保留其完整路径。这些额外的路径元素被称为“隐含目录”(即上面例子中的“foo”和“foo/bar”目录)。

从rsync 3.0.0开始,即使路径元素是发送端的符号链接,rsync也始终将这些隐含的目录作为文件列表中的实际目录来发送。这可以防止在复制文件的完整路径时,由于没有发现路径中有符号链接而产生的一些意想不到的行为。如果要复制服务器端符号链接,请通过其路径包含符号链接,并通过其实际路径包含引用目录。如果发送方是一个较老的rsync,可能需要使用–no-implied-dirs选项。

还可以限制作为隐含目录为你指定的每个路径发送的路径信息数量。对于较新的rsync(从2.6.7开始)发送端,可以在源路径中插入一个点和一个斜线,如下所示:

rsync -avR /foo/./bar/baz.c remote:/tmp/

这将在远程机器上创建/tmp/bar/baz.c。(注意,点必须后跟一个斜杠,所以“/foo/.”不会被缩写。)。对于较老的rsync版本,你需要使用chdir来限制源路径。例如,推送文件时:

(cd /foo; rsync -avR bar/baz.c remote:/tmp/)

(请注意,括号将这两个命令放入一个子shell中,以便“cd”命令对未来的命令不会保持有效。)如果要从较旧的rsync中提取文件,使用如下命令(但仅限于对于非守护进程传输):

rsync -avR –rsync-path=”cd /foo; rsync” remote:bar/baz.c /tmp/

–no-implied-dirs
该选项会影响–relative选项的行为。指定时,来自源名称的隐含目录的属性不包含在传输中。这意味着目标系统上的相应路径元素,如果存在则保持不变,并且使用默认属性创建任何缺少的隐含目录。这甚至允许这些隐含的路径元素具有很大的差异,例如作为接收方目录的符号链接。

例如,如果使用命令行参数或–files-from条目告诉rsync传输文件“path/foo/file”,则在使用–relative时,则“path”和“path/foo”为隐含目录。如果在目标系统上“path/foo”是“bar”的符号链接,接收的rsync通常会删除“path/foo”,将其重新创建为目录,并将文件接收到新目录中。使用–no-implied-dirs,接收rsync使用现有路径元素更新“path/foo/file”,这意味着该文件最终将在“path/bar”中创建。完成这种链接保存的另一种方法是使用–keep-dirlinks选项(这也会影响其他传输中的目录的符号链接)。

从低于3.0.0的rsync拉取文件时,如果发送方在请求的路径中具有符号链接,并且希望将隐含目录作为普通目录传输,则可能需要使用此选项。

-b, –backup
使用此选项,当每个文件被传输或删除时,先前存在的目标文件将被重命名。可以使用–backup-dir和–suffix选项控制备份文件的位置以及后缀(如果有)。

注意,如果你没有指定–backup-dir:(1)将隐含–omit-dir-times选项,并且(2)如果–delete也有效(没有–delete-excluded),rsync将为备份后缀添加“保护”过滤规,添加到所有现有的排除项的末尾(例如-f “P *~”)。这将防止以前备份的文件被删除。请注意,如果你提供了自己的过滤规则,则可能需要手动将自己的排除/保护规则插入列表中,放在一个较高位置,以使其具有足够高的优先级以生效(例如,如果你的规则指定了’*’的尾随包含/排除,则永远不会达到自动添加的规则)。

–backup-dir=DIR
结合–backup选项,这会告诉rsync将所有备份存储在接收端的指定目录中。这可以用于增量备份。还可以使用–suffix选项指定备份后缀(否则备份在指定目录中的文件将保留其原始文件名)。

请注意,如果指定相对路径,备份目录将相对于目标目录,因此你可能想要指定绝对路径或以“../”开头的路径。如果rsync守护进程是接收方,则备份目录不能超出模块的路径层次结构,因此请特别注意不要将其删除或复制到其中。

–suffix=SUFFIX
此选项允许你覆盖与–backup(-b)选项一起使用的默认备份后缀。如果没有指定–backup-dir,则默认后缀为~,否则为空字符串。

-u, –update
这会强制rsync跳过目标上存在的任何文件,并且修改时间比源文件更新。(如果现有目标文件的修改时间等于源文件的修改时间,如果大小不同,它将被更新。)

请注意,这不影响目录、符号链接或其他特殊文件的复制。另外,发送者和接收者之间的文件格式差异总是被认为对于更新来说足够重要,不管对象上的日期是什么。换句话说,如果目的地址有文件的地方源有一个目录,则不管时间戳如何,传输都会发生。

此选项是一个传输规则,而不是排除,因此它不会影响进入文件列表的数据,因此不会影响删除。它只是限制接收器请求传输的文件。

–inplace
这个选项改变了rsync在数据需要更新时如何传输文件:而不是创建文件的新副本并在完成后将其移动到位的默认方法,rsync将更新后的数据直接写入目标文件。

这有几个作用:

  • 硬链接不被破坏。这意味着新数据将通过其他目标文件的硬链接显示。此外,尝试将不同的源文件复制到多重链接的目标文件中将导致目标数据来回变换的“拔河”。
  • 正在使用的二进制文件无法更新(操作系统将阻止这种情况发生,或者试图交换数据的二进制文件将不正常或崩溃)。
  • 在传输过程中,文件的数据将处于不一致的状态,如果传输中断或更新失败,该文件将保留这种方式。
  • rsync无法写入的文件无法更新。虽然超级用户可以更新任何文件,但需要授予普通用户写入权限以便写入文件才能成功。
  • 如果目标文件中的某些数据在被复制到文件后面的某个位置之前被覆盖,则rsync的delta-transfer算法的效率可能会降低。如果使用–backup,这不适用,因为rsync足够聪明,可以使用备份文件作为传输的基础文件。

警告:不应该使用此选项来更新其他人正在访问的文件,因此使用此选项时时要小心。

此选项对于使用基于块的更改或附加数据来传输大文件很有用,也适用于磁盘绑定而非网络绑定的系统。它还可以帮助保持写时复制文件系统快照避免分散只有轻微更改的文件的全部内容。

该选项隐含了–partial(因为中断的传输不会删除文件),但与–partial-dir和–delay-updates冲突。在rsync 2.6.4之前,–inplace也与–compare-dest和–link-dest不兼容。

–append
这会导致rsync通过将数据附加到文件末尾来更新文件,这会假定接收端已存在的数据与发送端文件的起始位置相同。如果文件需要传输并且接收方的文件大小与发送方的文件大小相同或更长,则文件将被跳过。在文件不需要传输时,这不会影响更新文件的非内容属性(例如权限,所有权等),也不会影响更新任何非常规文件。隐含了–inplace,但与–sparse不冲突(因为它总是扩展文件的长度)。

如果不能100%确定更长的文件只通过将数据附加到最后才生长,那么使用–append可能会非常危险。因此,应该使用包含/排除/过滤规则来确保此类传输仅影响你100%确认的是通过附加数据来增长的文件。

–append-verify
这与–append选项一样工作,但接收端的现有数据被包含在完整文件校验和验证步骤中,如果最终验证步骤失败则会导致文件的重新发送(rsync重新发送时,使用正常、非追加的–inplace传输)。

注意:在rsync 3.0.0之前,–append选项的工作方式与–append-verify相似,因此如果你正在与较早的rsync进行交互(或者传输协议是30之前),则指定append选项将启动–append-verify传输。

-d, –dirs
告诉发送方包含遇到的任何目录。与–recursive不同,除非指定的目录名称为“.”,否则不会复制目录的内容。或以结尾斜线(例如”.”, “dir/.”, “dir/”等)结尾。如果没有这个选项或者–recursive选项,rsync会跳过它遇到的所有目录(并且为每个目录输出一个消息)。如果你同时指定–dirs和–recursive,–recursive优先。

如果未指定–recursive,–dirs选项由–files-from选项或–list-only选项隐含(包括隐含–list-only选项的情况)。如果想关闭此功能,请指定–no-dirs(或–no-d)。

还有一个向后兼容的帮助程序选项–old-dirs(或–old-d),它告诉rsync使用“-r –exclude=’/*/*’”来让旧的rsync不递归而列出单个目录。

–copy-unsafe-links
这告诉rsync复制指向复制树之外的符号链接的引用。绝对符号链接也像普通文件一样处理,当使用–relative时,源路径本身中的任何符号链接也是如此。如果还指定了–copy-links,则此选项不具有其他作用。

–safe-links
这告诉rsync忽略指向复制树之外的任何符号链接。所有绝对符号链接也被忽略。将此选项与–relative结合使用可能会产生意想不到的结果。

–munge-links
该选项告诉rsync(1)修改接收端的所有符号链接,使其不可用但可恢复(见下文),或(2)解除发送端以符合状态存储的符号链接。如果你不相信数据的来源,这将不会试图将符号链接中放在意想不到的地方。

rsync禁用符号链接的方式是在每个字符串前添加字符串“/rsyncd-munged/”。这可以防止链接被使用,只要该目录不存在。启用此选项时,如果该路径是目录或符号链接到目录,rsync将拒绝运行。

该选项仅影响传输的客户端,因此如果你需要它来影响服务器,请通过–remote-option指定它。(请注意,在本地传输中,客户端是发送方。)

该选项对守护进程没有影响,因为守护进程通过其“munge symlinks”参数配置是否需要通用符号链接。另请参阅源代码的支持目录中的“munge-symlinks”perl脚本。

-k, –copy-dirlinks
该选项使发送端将一个符号链接视为一个真实的目录。如果你不希望到非目录的符号链接受到影响,那么这很有用,因为它们将使用–copy-links。

如果没有这个选项,如果发送端用一个到目录的符号链接替换了一个目录,接收端将删除任何阻碍新符号链接的东西,包括一个目录层次结构(只要–force或–delete有效)。

另请参阅–keep-dirlinks以获取接收方的类似选项。

–copy-dirlinks适用于源中所有到目录的符号链接。如果你只想遵循一些指定的符号链接,你可以使用的一个技巧是将它们作为附加的源参数传递,并在后面添加斜杠,使用–relative来使路径匹配正确。例如:

rsync -r –relative src/./ src/./follow-me/ dest/

这是有效的,因为rsync在给定的源参数上调用lstat(2),并且结尾的斜杠使得lstat(2)跟随符号链接,在文件列表中给目录一个加号,那么该目录会覆盖在扫描“src/./”发行的符号链接。

-K, –keep-dirlinks
这个选项会使接收端将一个符号链接视为一个真实的目录,但前提是它匹配发件人的真实目录。如果没有这个选项,接收者的符号链接将被删除并替换为一个真实的目录。

例如,假设传输包含文件“file”的目录“foo”,但“foo”是接收端上到目录“bar”的符号链接。没有–keep-dirlinks,接收方删除符号链接“foo”,将其重新创建为一个目录,并将该文件接收到新目录中。使用–keep-dirlinks,接收方保持符号链接,“file”进入“bar”结尾。

请注意一点:如果你使用–keep-dirlinks,则必须信任副本中的所有符号链接!如果不可信用户可以创建自己的符号链接到任何目录,则用户可以(在随后的副本上)用实际目录替换符号链接,并影响符号链接引用的任何目录的内容。对于备份副本,最好使用类似于绑定挂载的方式而不是符号链接来修改接收层次结构。

另请参阅–copy-dirlinks用于发送端的类似选项。

-H, –hard-links
这告诉rsync在源文件中查找硬连接的文件,并将目标上的相应文件链接在一起。如果没有这个选项,源文件中的硬链接文件将被视为单独文件。

该选项不一定确保目标硬链接的模式与源上的模式完全匹配。目的地可能以额外的硬链接结束的情况包括以下内容:

  • 如果目标包含无关的硬链接(比源文件列表中存在更多的链接),则复制算法不会明确地分解它们。但是,如果一个或多个路径存在内容差异,则正常的文件更新过程将打破这些额外的链接(除非使用–inplace选项)。
  • 如果指定包含硬链接的–link-dest目录,则由于–link-dest关联,目标文件与–link-dest文件的链接可能导致目标中的某些路径链接在一起。

请注意,rsync只能检测传输集内的文件之间的硬链接。如果rsync更新一个文件,该文件与传输之外的文件具有额外的硬连接连接,则该连接将被破坏。如果你试图使用–inplace选项来避免这种破损,请非常小心,你知道文件的更新方式,以确保不会由于硬链接而发生意外更改(请参阅–inplace更多警告选项)。

如果增量递归处于活动状态(参阅–recursive),则rsync可能会传输缺少的硬链接文件,在发现该内容的其他链接存在于层次结构中的其他位置之前。这不会影响传输的准确性(即哪些文件被硬连接在一起),只是它的效率(即复制数据以获得一个新的早期版本的硬链接文件,这些文件可能在传输后期发现另一个硬链接文件集的成员)。避免这种低效率的一种方法是使用–no-inc-recursive选项禁用增量递归。

-p, –perms
此选项会导致接收rsync将目标权限设置为与源权限相同。(另请参阅–chmod选项,了解如何修改rsync认为是源权限的方法。)

当此选项关闭时,权限设置如下:

  • 现有文件(包括更新文件)保留其现有权限,但–executability选项可能会改变文件的执行权限。
  • 新文件的“正常”权限位被设置为源文件的权限接收目录的默认权限(接收进程的umask,或者通过目标目录的默认ACL指定的权限)以及它们特殊的permission位禁用,除非新目录从其中父目录继承setgid位。

因此,当禁用–perms和–executability时,rsync的行为与其他文件复制实用程序(如cp(1)和tar(1))的行为相同。

总结:为目标文件(包括旧的和新的)提供源文件权限,请使用–perms。要为新文件指定目标默认权限(同时保留现有文件不变),请确保–perms选项已关闭,并使用–chmod=ugo=rwX(它确保所有非屏蔽位都已启用)。如果你想让后面的行为更容易输入,你可以为它定义一个popt别名,比如把这行放在~/.popt文件中(下面定义了-Z选项,并且包括–no-g使用目标dir的默认组):

# rsync alias -Z –no-p –no-g –chmod=ugo=rwX

然后,你可以在这个命令中使用这个新选项:

# rsync -avZ src/ dest/

(注意:确保-a不跟随-Z后面,否则它将重新启用上面提到的两个“–no-*”选项。)

在–perms关闭时保留新创建的目录上的目标setgid位的内容已添加到rsync 2.6.7中。当–perms关闭时,较旧的rsync版本错误地保留了新创建文件的三个特殊权限位,同时覆盖了新创建的目录上的目标的setgid位设置。缺省ACL守护已添加到rsync 2.6.7的ACL修补程序,因此即使存在默认ACL,旧的(或未启用ACL的)rsyncs也会使用umask。(记住,它是影响这些行为的接收rsync的版本。)

-E, –executability
此选项会导致rsync在–perms未启用时,保留常规文件的可执行性(或不可执行性)。如果在其权限中至少打开了一个“x”,则认为常规文件是可执行文件。当现有目标文件的可执行性与相应源文件的可执行性不同时,rsync将按如下方式修改目标文件的权限:

  • 要使文件不可执行,rsync会关闭其所有’x’权限。
  • 为了使文件成为可执行文件,rsync会打开每个具有相应’r’权限的’x’权限。

如果启用了–perms,该选项将被忽略。

-A, –acls
此选项会导致rsync将目标ACL更新为与源ACL相同。该选项隐含了–perms。

源系统和目标系统必须具有兼容的ACL条目才能使此选项正常工作。请参阅–fake-super选项以备份和恢复不兼容的ACL。

-X, –xattrs
此选项会导致rsync将目标扩展属性更新为与源目录相同。

对于支持扩展属性命名空间的系统,由超级用户完成的复制将复制除system*以外的所有名称空间。普通用户只复制user.*名称空间。为了能够以普通用户的身份备份和恢复非用户名称空间,请参阅–fake-super选项。

请注意,除非重复选项(例如-XX),否则此选项不会复制rsyncs特殊的xattr值(例如–fake-super使用的值)。这个“复制所有xattrs”模式不能与–fake-super一起使用。

–chmod
该选项告诉rsync将一个或多个逗号分隔的“chmod”模式应用于传输中文件的许可权限。将结果值视为发送方为该文件提供的权限,这意味着如果未启用–perms,则此选项似乎对现有文件没有影响。

除了在chmod(1)手册中指定的常规解析规则之外,还可以指定一个只应用于目录的项目,方法是将其前缀为“D”,或者指定仅应用于文件的项目它与’F’。例如,以下内容将确保所有目录都被标记为setgid,没有文件是其他人可写入的,都是用户和组可写,并且它们在所有位中都具有一致的可执行性:

–chmod=Dg+s,ug+w,Fo-w,+X

使用八进制模式编号也是允许的:

–chmod=D2775,F664

指定多个–chmod选项也是合法的,因为每个附加选项都只是附加到要做的更改列表中。

有关如何将结果权限值应用于传输中的文件,请参阅–perms和–executability选项。

-o, –owner
此选项会导致rsync将目标文件的所有者设置为与源文件相同,但仅当接收的rsync作为超级用户运行时(另请参阅–super和–fake-super选项)。如果没有此选项,则新文件及传输文件的所有者将设置为接收方的调用用户。

保留所有权将默认关联匹配的名称,但在某些情况下可能会退回到使用ID号(另请参阅–numeric-ids选项以进行全面讨论)。

-g, –group
该选项使rsync将目标文件的组设置为与源文件相同。如果接收程序没有以超级用户的身份运行(或者指定了–no-super),则仅保留接收方的调用用户所属的组。如果没有此选项,则该组将被设置为接收方的调用用户的默认组。

保存组信息会默认关联匹配的名称,但在某些情况下可能会回退到使用ID号(另请参阅–numeric-ids选项以获得完整的讨论)。

–devices
使rsync传输字符和块设备文件到远程系统,来重建这些设备。如果接收端的rsync不是以超级用户运行,那么该选项无效。(参见–super和–fake-super选项)。

–specials
该选项会使rsync传输特殊文件,比如:命名的套解字、fifo。

-D
等价于同时指定–devices和–specials

-t, –times
这告诉rsync传输修改时间以及文件并在远程系统上更新它们。请注意,如果未使用此选项,排除未被修改的文件的优化将无法生效; 换句话说,缺少-t或-a会导致下一次传输的行为就像使用-I一样,导致所有文件都被更新(尽管rsync的delta-transfer算法会使更新效率更高,如果文件没有实际上改变了,使用-t更好)。

-O, –omit-dir-times
这告诉rsync在保存修改时间时忽略目录(请参阅–times)。如果NFS在接收端共享目录,最好使用-O。如果你使用–backup而没有–backup-dir,则间接使用此选项。

此选项还具有避免在增量递归副本中尽早创建目录的副作用。默认的–inc-recursive复制通常会执行父目录中所有子目录的早期创建传递,以便能够立即设置父目录的修改时间(而不必延迟 直到一堆递归复制完成)。如果目录修改时间未被保留,则这种早期创建的习惯用法是不必要的,因此它被跳过。由于早期创建的目录没有准确的模式、mtime、所有权,所以当有人想要避开这些部分完成的目录时,使用此选项可以提供帮助。

-J, –omit-link-times
这告诉rsync在保留修改时间时,忽略符号链接(请参阅–times)。

–super
这告诉接收方尝试超级用户活动,即使超级用户未运行接收rsync。这些活动包括:通过–owner选项保留用户,通过–groups选项保留所有组(不仅仅是当前用户的组),并通过–devices选项复制设备。这对于不需要超级用户的情况下允许这种活动的系统很有用,并且可以确保如果接收方没有以超级用户的身份运行,就会发生错误。要关闭超级用户活动,超级用户可以使用–no-super。

–fake-super
启用此选项时,rsync通过通过附加到每个文件的特殊扩展属性(根据需要)保存/恢复特权属性来模拟超级用户活动。这包括文件的所有者和组(如果它不是默认的),文件的设备信息(设备和特殊文件被创建为空文本文件)以及我们不允许在实际文件上设置的任何权限位(例如,为了安全起见,真正的文件得到了u-s,g-s,o-t),或者会限制所有者的访问权限(因为真正的超级用户总是可以访问/更改文件,所以创建的用户始终可以访问/更改我们创建的文件)。该选项还处理ACL(如果指定了–acls)和非用户扩展属性(如果指定了–xattrs)。

这是在不使用超级用户的情况下备份数据以及从不兼容的系统存储ACL的好方法。

选项–fake-super仅影响使用该选项的一侧。要影响远程shell连接的远程端,请使用–remote-option(-M)选项:

rsync -av -M–fake-super /src/ host:/dest/

对于本地副本,此选项同时影响源和目标。如果希望本地副本仅为目标文件启用此选项,请指定-M–fake-super。如果你希望本地副本仅为源文件启用此选项,请将–fake-super与-M–super结合使用。

这个选项被–super和–no-super覆盖。

另请参阅守护进程的rsyncd.conf文件中的“fake super”设置。

-S, –sparse
尝试有效地处理稀疏文件,以便在目标上占用更少的空间。与–inplace冲突,因为无法以稀疏的方式覆盖数据。

–preallocate
这会告诉接收方在将数据写入文件之前将每个目标文件分配给其最终大小。rsync只会使用Linux的fallocate(2)系统调用或Cygwin的posix_fallocate(3)提供的真正的文件系统级预分配支持,而不是缓慢的glibc实现,它将零字节写入每个块。

如果没有这个选项,文件系统上的较大文件可能不完全连续,但使用此选项,rsync可能会更慢地复制。如果目的地不是支持扩展的文件系统(如ext4,xfs,NTFS等),则此选项可能没有任何积极影响。

-n, –dry-run
这使得rsync执行试运行,不会做任何更改(并且产生的输出与实际运行大部分相同)。它通常与-v,–verbose和/或-i,–itemize-changes选项结合使用,以查看在实际运行rsync命令之前要执行的操作。

在一次空运行和随后的实际运行中( – 除故意的欺骗和系统调用失败),–itemize-changes的输出应该完全相同; 如果不是,那是一个错误。其他输出应该基本保持不变,但在某些地区可能会有所不同。值得注意的是,空运行并不发送文件传输的实际数据,所以–progress没有效果,the “bytes sent”, “bytes received”, “literal data”, “matched data”统计量太小, “speedup”值相当于不需要文件传输的运行。

-W, –whole-file
有了这个选项,rsync的增量转移算法就不会被使用,整个文件就会按原样发送。如果在源机器和目标机器之间的带宽高于磁盘带宽时使用此选项(特别是当“磁盘”实际上是联网文件系统时),则传输速度可能会更快。当源和目标都被指定为本地路径时,这是默认设置,但只有在没有批处理写入选项生效的情况下。

-x, –one-file-system
这告诉rsync在递归时避免跨越文件系统边界。这并不限制用户指定要从多个文件系统进行复制的项目,只需通过用户指定的每个目录的层次结构进行rsync递归,也不会限制删除期间接收方的类似递归。另外请记住,rsync将同一个设备上的绑定挂载视为同一个文件系统。

如果重复执行此选项,rsync会忽略复制中的所有挂载点目录。否则,它会在遇到的每个安装点处包含一个空目录(使用挂载目录的属性,因为底层安装点目录的属性无法访问)。

如果rsync已被告知折叠符号链接(通过–copy-links或–copy-unsafe-links),则将另一台设备上的目录的符号链接视为挂载点。到非目录的符号链接不受此选项的影响。

–existing, –ignore-non-existing
这告诉rsync跳过创建目标上还不存在的文件(包括目录)。如果此选项与–ignore-existing选项结合使用,则不会更新任何文件(如果你只想删除无关文件,则可以使用该选项)。

此选项是一个传输规则,而不是排除,因此它不会影响进入文件列表的数据,因此不会影响删除。它只是限制接收器请求传输的文件。

–ignore-existing
这告诉rsync跳过目标上已经存在的更新文件(这不会忽略现有的目录,或者什么都不会完成)。另见–existing。

此选项是一个传输规则,而不是排除,因此它不会影响进入文件列表的数据,因此不会影响删除。它只是限制接收器请求传输的文件。

当需要继续进行中断的备份运行时,对于那些使用–link-dest选项进行备份的用户可以使用此选项。由于–link-dest运行被复制到一个新的目录层次结构中(当它被正确使用时),使用–ignore-existing将确保已处理的文件不会被调整(这可以避免对硬链接文件权限的变更)。这确实意味着此选项仅查看目标层次结构本身中的现有文件。

–remove-source-files
这告诉rsync从发送端删除作为传输一部分的文件(意思是非目录),并且已经在接收端成功复制。

请注意,你只应在静态的源文件上使用此选项。如果你正在使用它将特定目录中显示的文件移动到另一个主机,请确保已完成的文件被重命名到源目录,而不是直接写入其中,防止rsync无法传输文件尚未完完全写入。如果你不能先将文件写入其他目录,则应该使用命名习惯用法,它允许rsync避免传输尚未完成的文件(例如,在写入文件时将文件命名为“foo.new”,将其重命名为“ foo“,然后使用选项–exclude =’*.new’进行rsync传输)。

从3.1.0开始,如果文件大小或修改时间没有保持不变,rsync将跳过发送端删除(并输出错误)。

–delete
这告诉rsync从接收端(不在发送端)删除多余的文件,但仅限于正在同步的目录。你必须要求rsync发送整个目录(例如“dir”或“dir/”),而不使用目录内容的通配符(例如“dir/*”),因为通配符被shell展开,rsync因此获得请求传输单个文件,而不是文件的父目录。除非你使用–delete-excluded选项或将规则标记为仅在发送方匹配(请参阅FILTER RULES部分中的包含/排除修饰符),否则从传输中排除的文件也被排除在删除之外。

在rsync 2.6.7之前,除非已启用–recursive,否则此选项将不起作用。从2.6.7开始,当启用–dirs(-d)时,也会发生删除,但仅限于其内容正在被复制的目录。

如果使用不当,此选项可能很危险!首先尝试使用–dry-run选项(-n)来查看哪些文件将被删除是一个非常好的主意。

如果发送方检测到任何I/O错误,则删除目标中的任何文件将被自动禁用。这是为了防止发送端的临时文件系统故障(如NFS错误)导致大量删除目标文件。你可以用–ignore-errors选项覆盖它。

–delete选项可以与–delete-WHEN选项中的一个组合使用,而不会发生冲突,以及–delete-excluded。但是,如果没有指定–delete-WHEN选项,rsync将在与rsync 3.0.0或更高版本交谈时选择–delete-during算法,而在与较旧的rsync交谈时选择–delete-before算法。另见–delete-delay和–delete-after。

–delete-before
要求在传输开始之前完成接收端的文件删除操作。有关文件删除的更多详细信息,请参阅–delete(隐含)。

如果文件系统空间不足并删除多余的文件,在传输之前删除将有助于传输。但是,它会在传输开始之前引入延迟,并且此延迟可能导致传输超时(如果指定了–timeout)。它还强制rsync使用旧的非递增递归算法,该算法要求rsync一次性将传输中的所有文件扫描到内存中(请参阅–recursive)。

–delete-during, –del
要求在传输过程中逐渐完成接收端的文件删除操作。每个目录的删除扫描都是在每个目录检查更新之前完成的,因此它的行为就像一个更高效的“删除之前”,包括在任何每个目录过滤器文件被更新之前执行删除操作。该选项首次添加到rsync版本2.6.4中。有关文件删除的更多详细信息,请参阅–delete(隐含)。

–delete-delay
要求在传输过程中计算接收端的文件删除(如–delete-during),然后在传输完成后删除。当与–delay-updates及–fuzzy结合使用时,这是很有用的,并且比使用–delete-after更有效(但是可以以不同的方式运行,因为–delete-after在更新完成的单独阶段中计算删除)。如果删除的文件数量溢出内部缓冲区,则会在创建一个临时文件来保存要删除的名字(它在打开时被删除,所以在传输过程中你不应该看到它)。如果临时文件的创建失败,rsync将尝试回退到使用–delete-after(如果–recursive执行增量扫描,则无法执行此操作)。有关文件删除的更多详细信息,请参阅–delete(隐含)。

–delete-after
请求在传输完成后完成接收端的文件删除操作。如果你要将新的每个目录合并文件作为传输的一部分发送,并且你希望其排除项在当前传输的删除阶段生效,那么这非常有用。它还强制rsync使用旧的非递增递归算法,该算法要求rsync一次性将传输中的所有文件扫描到内存中(请参阅 – 递归)。有关文件删除的更多详细信息,请参阅–delete(隐含)。

–delete-excluded
除了在接收端删除不在发送端的文件外,它还告诉rsync同时删除接收端排除的任何文件(请参阅–exclude)。请参阅FILTER RULES部分,了解如何在接收机上以这种方式执行个别排除行为,以及如何保护文件免受–delete排除。有关文件删除的更多详细信息,请参阅–delete(隐含)。

–ignore-missing-args
当rsync首先处理显式请求的源文件(例如命令行参数或–files-from条目)时,如果找不到该文件,通常会发生错误。此选项可以抑制该错误,并且不会尝试传输文件。如果一个文件最初被发现存在,并且以后不再存在,这不会影响随后的消失文件错误。

–delete-missing-args
此选项将(隐含的)–ignore-missing-args选项的行为更进一步:每个缺失的arg将成为接收端相应目标文件(如果存在)的删除请求。如果目标文件是非空目录,则只有在–force或–delete有效时才能成功删除目标文件。除此之外,该选项独立于任何其他类型的删除处理。

缺少的源文件由特殊的文件列表条目表示,这些文件列表条目在–list-only输出中显示为“*missing”条目。

–ignore-errors
告诉–delete继续执行并删除文件,即使遇到了错误。

–force
这个选项告诉rsync删除一个非空目录,当它被非目录替换时。这只有在删除没有激活时才有意义(请参阅 – 删除详细信息)。

请注意旧的rsync版本:在使用–delete-after之后,–force仍然是必需的,并且除非启用了–recursive选项,否则它以前不起作用。

–max-delete=NUM
这告诉rsync不要删除多于NUM个文件或目录。如果超过此限制,则在传输结束时会跳过所有进一步的删除操作。最后,rsync会输出一个警告(包括跳过删除的计数)并退出,出错代码为25(除非还有一些更重要的错误情况发生)。

从版本3.0.0开始,你可以指定–max-delete=0,以警告有关目标中的任何无关文件,而不删除它们中的任何文件。较老的客户端将其解释为“无限制”,因此如果你不知道客户端的版本是什么,则可以使用不明显的–max-delete=-1作为向后兼容的方式来指定不允许删除 尽管真正的旧版本在超出限制时没有发出警告)。

–max-size=SIZE
这告诉rsync避免传输任何大于指定SIZE的文件。SIZE值可以用一个字符串作为后缀以指示大小乘数,并且可以是小数值(例如“–max-size=1.5m”)。

此选项是一个传输规则,而不是排除,因此它不会影响进入文件列表的数据,因此不会影响删除。它只是限制接收器请求传输的文件。

后缀如下:“K”(或“KiB”)是kibibyte(1024),“M”(或“MiB”)是mebibyte(1024 * 1024)和“G”(或“GiB”)是一个gibibyte(1024 * 1024 * 1024)。如果你希望乘数为1000而不是1024,请使用“KB”、“MB”、“GB”。(注意:所有值都接受小写。)最后,如果后缀以“+1”或“-1”结尾,则该值将在指示的方向上偏移一个字节。

示例:–max-size=1.5mb-1为1499999字节,–max-size=2g+1为2147483649字节。

请注意,3.1.0之前的rsync版本不允许–max-size=0。

–min-size=SIZE
这告诉rsync避免传输小于指定SIZE的文件,这可以帮助不传输小的垃圾文件。有关SIZE和其他信息的描述,请参阅–max-size选项。

请注意,3.1.0之前的rsync版本不允许–min-size=0。

-B, –block-size=BLOCKSIZE
这会将rsync的增量转移算法中使用的块大小强制为固定值。通常根据每个正在更新的文件的大小来选择它。详情请参阅技术报告。

-e, –rsh=COMMAND
此选项允许你选择一个替代的远程shell程序用于rsync的本地和远程副本之间的通信。通常,rsync默认配置为使用ssh,但你可能更喜欢在本地网络上使用rsh。

如果此选项与[user@]host::module/path一起使用,则远程shell命令将用于在远程主机上运行rsync守护程序,并且所有数据将通过远程shell连接传输,而不是通过一个到远程主机上正在运行的rsync守护程序的直接套接字连接。请参阅上面的“USING rsync-DAEMON FEATURES VIA A REMOTE-SHELL CONNECTION”一节。

COMMAND中允许使用命令行参数,前提是COMMAND作为单个参数呈现给rsync。你必须使用空格(而不是制表符或其他空格)将命令和参数彼此分开,并且可以使用单引号或双引号将参数中的空格保留(但不是反斜杠)。请注意,在单引号字符串内加倍单引号会给你一个单引号; 同样用于双引号(尽管你需要注意你的shell解析哪些引号以及rsync解析哪些引号)。一些例子:

-e ‘ssh -p 2234’

-e ‘ssh -o “ProxyCommand nohup ssh firewall nc -w1 %h %p”‘

(请注意,ssh用户可以在其.ssh / config文件中交替地自定义站点特定的连接选项。)

你还可以使用rsync_RSH环境变量选择远程shell程序,该环境变量接受与-e相同的值范围。

另请参阅受此选项影响的–blocking-io选项。

–rsync-path=PROGRAM
使用它来指定在远程机器上运行哪个程序来启动rsync。rsync不在默认的远程shell路径中时经常使用(例如–rsync-path=/usr/local/bin/rsync)。请注意,PROGRAM是在shell的帮助下运行的,因此它可以是任何你需要运行的程序,脚本或命令序列,只要它不会破坏rsync用于沟通的标准输入和标准输出。

一个棘手的例子是在远程机器上设置一个不同的默认目录用于–relative选项。例如:

rsync -avR –rsync-path=”cd /a/b && rsync” host:c/d /e/

-M, –remote-option=OPTION
此选项用于更高级的情况,你希望某些效果仅限于传输的一侧。例如,如果要将–log-file=FILE和–fake-super传递给远程系统,请将其指定为:

rsync -av -M –log-file=foo -M–fake-super src/ dest/

如果你希望有一个选项只影响双方的传输中的本地端,则将其否定发送给远端。向这个:

rsync -av -x -M–no-x src/ dest/

请谨慎使用此选项,因为可能会切换一个选项,导致rsync对接下来要在套接字中指示的数据有不同的想法,并且会使其失败。

请注意,最好为要传递的每个选项使用单独的–remote选项。这使你的用途与–protect-args选项兼容。如果该选项关闭,则远程选项卡中的任何空格将被远程shell拆分,除非你采取措施保护它们。

当进行本地传输时,“本地”端是发送端,“远端”端是接收端。

注意一些版本的popt选项解析库有一个bug,它们会阻止你在一个短的选项字母旁边使用相邻的arg(例如-M–log-file=/tmp/foo)。如果这个bug影响你的popt版本,你可以使用rsync附带的popt版本。

-C, –cvs-exclude
这是一种有用的简写形式,用于排除你通常不希望在系统间传输的大量文件。它使用与CVS类似的算法来确定文件是否应该被忽略。

排除列表被初始化以排除以下项目(这些初始项目被标记为易腐 – 参见FILTER RULES部分):

RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state .nse_depinfo *~ #* .#* ,* _$* *$

*.old *.bak *.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj *.so *.exe *.Z *.elc *.ln core .svn/

.git/ .hg/ .bzr/

然后$HOME/.cvsignore中列出的文件将被添加到列表中,并且CVSIGNORE环境变量中列出的所有文件(所有cvsignore名称均以空格分隔)。

最后,如果任何文件与.cvsignore文件位于同一目录中并且与其中列出的某种模式相匹配,则会忽略它。与rsync的过滤/排除文件不同,这些模式被分割为空格。有关更多信息,请参见cvs(1)手册。

如果你将-C与你自己的–filter规则相结合,则应注意,无论-C放置在命令行的哪个位置,这些CVS排除项都会附加在你自己的规则末尾。这使得它们的优先级低于你明确指定的任何规则。如果要控制这些CVS排除的内容插入到过滤规则中,则应省略-C作为命令行选项,并使用–filter=:C和–filter=-C的组合(在你的命令行或通过将“:C”和“-C”规则与你的其他规则一起放入过滤器文件中)。第一个选项打开.cvsignore文件的每个目录扫描。第二种选择是上面的CVS的排除规则的一次导入。

–files-from=FILE
使用此选项可以指定要传输的文件的确切列表(如从指定的FILE读取或 – 对于标准输入)。它还调整了rsync的默认行为,以便更轻松地传输指定的文件和目录:

  • 隐含–relative(-R)选项,该选项保留为文件中的每个项目指定的路径信息(如果要将其关闭,请使用–no-relative或–no-R)。
  • 隐含–dirs(-d)选项,它将创建目标列表中指定的目录,而不是以任意方式跳过它们(如果要关闭它,请使用–no-dirs或–no-d) 。
  • –archive(-a)选项的行为并不意味着–recursive(-r),因此如果需要,请明确指定它。
  • 这些副作用会改变rsync的默认状态,因此命令行中–files-from选项的位置与解析其他选项的方式无关(例如-a在文件之前或之后的作用相同,正如–no-R和所有其他选项)。

从FILE读取的文件名都与源目录相关 – 任何前导斜杠都将被删除,并且不允许“..”引用高于源目录。例如,采取这个命令:

rsync -a –files-from=/tmp/foo /usr remote:/backup

如果/tmp/foo包含字符串“bin”(甚至是“/bin”),则将在远程主机上将/usr/bin目录创建为/backup/bin。如果它包含“bin/”(注意尾部斜线),则该目录的直接内容也将被发送(无需在文件中明确提及 –
这从版本2.6.4开始)。在这两种情况下,如果启用了-r选项,那么该目录的整个层次结构也将被传输(请记住,-r需要使用–files-from明确指定,因为它没有隐含在-a中)。另请注意,–relative(默认启用)选项是仅复制从文件读取的路径信息 – 它不会强制重复指定的源路径(在本例中为/usr)。

另外,如果在文件前面指定了“host:”(主机必须匹配传输的一端),则可以从远程主机而不是本地主机读取–files-from文件。作为捷径,你可以只指定“:”的前缀来表示“使用传输的远程端”。例:

rsync -a –files-from=:/path/file-list src:/ /tmp/copy

这将复制位于远程“src”主机上的/path/file-list文件中指定的所有文件。

如果指定了–iconv和–protect-args选项,并且从一个主机向另一个主机发送–files-from文件名,则文件名将从发送主机的字符集转换为接收主机的字符集。

注意:对–files-from输入中的文件列表进行排序可帮助rsync更高效,因为它将避免重新访问相邻条目之间共享的路径元素。如果输入未被排序,某些路径元素(隐含目录)最终可能会被多次扫描,并且rsync在它们变成文件列表元素后最终将不会复制它们。

-0, –from0
这告诉rsync它从文件中读取的规则/文件名被一个空(’\0’)字符终止,而不是NL,CR或CR+LF。这会影响–exclude-from,–include-from,–files-from, –filter规则中指定的任何合并文件。它不会影响–cvs-exclude(因为从.cvsignore文件读取的所有名称都是以空格分隔的)。

-s, –protect-args
该选项将所有文件名和大多数选项发送到远程rsync,而不允许远程shell解释它们。这意味着空格不会被分割,并且任何非通配符特殊字符都不会被翻译(例如~、$、;、&等)。通配符在远程主机上通过rsync进行扩展(而不是shell)。

如果将此选项与–iconv一起使用,则与远程端相关的参数也将从本地转换为远程字符集。翻译发生在通配符扩展之前。另请参阅–files-from选项。

你也可以通过rsync_PROTECT_ARGS环境变量来控制此选项。如果此变量具有非零值,则默认情况下将启用此选项,否则默认情况下将禁用此选项。任何状态都会被命令行手动指定的的选项所覆盖(如–no-s和–no-protect-args)。由于此选项是在3.0.0中首次引入的,因此如果你需要与远程的rsync进行交互,则需要确保该选项处于禁用状态。

rsync也可以配置(在构建时),默认情况下启用该选项(环境和命令行都会覆盖该选项)。这个选项最终会成为未来某个尚未确定的新的默认设置。

-T, –temp-dir=DIR
此选项指示rsync在创建在接收端传输的文件的临时副本时将DIR用作临时目录。默认行为是在与关联的目标文件相同的目录中创建每个临时文件。从rsync 3.1.1开始,指定DIR内的临时文件名不会以一个额外的点作为前缀(尽管它们仍然会添加一个随机后缀)。

当接收磁盘分区没有足够的可用空间来容纳传输中最大文件的副本时,最常使用此选项。在这种情况下(即,当暂存目录位于不同的磁盘分区上时),rsync将无法将相关目标文件顶部的每个接收到的临时文件重命名,而是必须将其复制到位。rsync通过
将文件复制到目标文件的顶部,这意味着在复制期间目标文件将包含截断的数据。如果没有这样做(即使目标文件首先被删除,数据本地复制到目标目录中的临时文件,
然后重新命名),老文件可能会继续占用磁盘空间(如果有人打开它),因此可能没有足够的空间同时在磁盘上安装新版本。

如果你使用此选项的原因不是缺少磁盘空间,你可能希望将其与–delay-updates选项结合使用,以确保将所有复制的文件放入目标层次结构中的子目录中,等待结束的转移。如果你没有足够的空间来复制目标分区上的所有到达文件,另一种告诉rsync你不太在意磁盘空间的方法是使用带相对路径的–partial-dir选项;因为这会告诉rsync可以在目标层次结构的子目录中存储单个文件的副本,rsync将使用partial-dir作为临时区域来复制复制的文件,然后将其重命名为那里。(用绝对路径指定–partial-dir不会产生这种副作用。)

-y, –fuzzy
该选项告诉rsync它应该为缺少的任何目标文件寻找基础文件。当前算法在与目标文件相同的目录中查找具有相同大小和修改时间的文件或类似名称的文件。如果找到,rsync使用模糊基础文件来尝试加快传输速度。

如果重复该选项,则模糊扫描也将在通过–compare-dest,–copy-dest或–link-dest指定的任何匹配备用目标目录中完成。

请注意,使用–delete选项可能会排除任何潜在的模糊匹配文件,因此如果需要防止这种情况发生,请使用–delete-after或指定某些文件名排除项。

–compare-dest=DIR
此选项指示rsync在目标计算机上使用DIR作为附加层次结构,以比较目标文件与传输(如果目标目录中缺少文件)。如果在DIR中找到与发件人文件相同的文件,则该文件将不会传输到目标目录。这对于仅创建从早期备份更改的文件的稀疏备份很有用。此选项通常用于复制到一个空的(或新创建的)目录。

从版本2.6.4开始,可能会提供多个–compare-dest目录,这将导致rsync按指定的顺序搜索列表以进行完全匹配。如果发现仅在属性中有所不同的匹配,则创建本地副本并更新属性。如果找不到匹配项,则会选择来自其中一个DIR的基础文件以尝试加快传输速度。

如果DIR是相对路径,则相对于目标目录。另请参阅–copy-dest和–link-dest。

注:从版本3.1.0开始,如果在其中一个compare-dest层次结构中找到完全匹配,rsync将从非空目标层次结构中删除文件(使最终结果更接近新鲜副本)。

–copy-dest=DIR
此选项的行为与–compare-dest相似,但rsync还会使用本地拷贝将在DIR中找到的未更改文件复制到目标目录。这对于在保持现有文件完好无损的情况下传输到新目标,然后在所有文件成功传输时进行闪存切换都很有用。

可能会提供多个–copy-dest目录,这会导致rsync按照为未更改的文件指定的顺序来搜索列表。如果找不到匹配项,则会选择其中一个DIR的基础文件来尝试加快传输速度。

如果DIR是相对路径,则相对于目标目录。另请参阅–compare-dest和–link-dest。

–link-dest=DIR
此选项的行为与–copy-dest相似,但未更改的文件从DIR链接到目标目录。这些文件必须在所有保留的属性(例如权限,可能的所有权)中相同,以便将文件链接在一起。一个例子:

rsync -av –link-dest=$PWD/prior_dir host:src_dir/ new_dir/

如果文件没有链接,请仔细检查它们的属性。还要检查是否某些属性在rsync的控制之外被迫使用,例如将root压缩到单个用户的挂在选项,或者安装具有通用所有权的可移动驱动器(例如OS X的“忽略此卷上的所有权”选项)。

从版本2.6.4开始,可能会提供多个–link-dest目录,这将导致rsync按指定的顺序搜索列表以进行完全匹配。如果发现仅在属性中有所不同的匹配,则创建本地副本并更新属性。如果找不到匹配项,则会选择来自其中一个DIR的基础文件以尝试加快传输速度。

此选项在复制到空目标分层结构时效果最佳,因为现有文件可能会调整其属性,并且可能会通过硬链接影响备用目标文件。另外,更改项目可能会有点混乱。请注意,在版本3.1.0之前,当目标文件已存在时,将永远不会找到替代目录精确匹配(也不会链接到目标)。

请注意,如果你将此选项与–ignore-times结合使用,则rsync将不会将任何文件链接到一起,因为它仅将相同的文件链接在一起,作为传输文件的替代品,从不作为文件更新后的附加检查。如果DIR是相对路径,则相对于目标目录。

另请参阅–compare-dest和–copy-dest。

请注意,2.6.1之前的rsync版本有一个错误,当-o被指定(或由-a指示)时,可能会阻止–link-dest对非超级用户正常工作。发送到旧的rsync时,你可以避免使用-o选项来解决此错误。

-z, –compress
使用此选项,rsync会在文件数据发送到目标机器时对其进行压缩,从而减少传输的数据量 – 这在缓慢连接时非常有用。

请注意,此选项通常可获得比使用压缩远程shell或压缩传输所能实现的更好的压缩比,因为它利用了未通过连接明确发送的匹配数据块中的隐式信息。但是,这种匹配数据压缩的代价是CPU的成本,并且可以通过重复-z选项来禁用,但只有在双方至少为3.1.1版时才是如此。

请注意,如果你的rsync版本是使用外部zlib(而不是rsync打包的zlib)编译的,那么它将不支持旧式压缩,仅支持新式(重复选项)压缩。在未来,这种新式压缩可能会成为默认设置。

客户端rsync通过–new-compress选项请求服务器上的新式压缩,所以如果你看到该选项被拒绝,则意味着服务器不够新以支持-zz。当新式压缩成为默认压缩时,rsync还会接受–old-compress选项。

请参阅–skip-compress选项以查看不会压缩的文件后缀的默认列表。

–compress-level=NUM
显式设置要使用的压缩级别(请参阅–compress),而不是将其设置为默认值。NUM的允许值介于0和9之间; 当指定–compress选项时默认为6。如果NUM不为零,则隐含–compress选项。

–skip-compress=LIST
覆盖不会被压缩的文件后缀列表。LIST应该是一个或多个文件后缀(不带圆点)用斜线(/)分隔。

你可以指定一个空字符串来指示不应跳过任何文件。

支持简单的字符类匹配:每个匹配都必须包含方括号内的字母列表(例如,不支持特殊类,如“[:alpha:]”,且’-‘没有特殊含义)。

字符星号(*)和问号(?)没有特殊含义。

以下是一个指定要跳过6个后缀的示例(因为5个规则中的1个匹配2个后缀):

–skip-compress=gz/jpg/mp[34]/7z/bz2

不会被压缩的默认后缀列表是这个(在此版本的rsync中):

7z ace avi bz2 deb gpg gz iso jpeg jpg lz lzma lzo mov mp3 mp4 ogg png rar rpm rzip tbz tgz tlz txz xz z zip

除了一种情况外,此列表将被你的–skip-compress列表替换:来自守护程序rsync的副本会将跳过的后缀添加到其非压缩文件列表(并且其列表可能被配置为不同的默认值) 。

–numeric-ids
使用此选项,rsync将传输数字组和用户标识,而不是使用用户名和组名,并在两端进行映射。

默认情况下,rsync将使用用户名和组名来确定提供文件的所有权。即使未指定–numeric-ids选项,特殊uid 0和特殊gid 0也不会通过用户/组名进行映射。

如果用户或组在源系统上没有名称,或者在目标系统上没有匹配,则将使用源系统中的数字ID。有关chroot设置如何影响rsync查找用户和组名称的能力以及你可以对此做些什么的信息,另请参阅rsyncd.conf联机帮助页中“use chroot”设置的注释。

–usermap=STRING, –groupmap=STRING
这些选项允许你指定接收方应映射到其他值的用户和组。STRING是一个或多个FROM:TO对以逗号分隔的值。来自发件人的任何匹配的FROM值都会被来自接收者的TO值替换。你可以为FROM和TO值指定用户名或用户ID,并且FROM值也可以是通配符字符串,该字符串将与发件人的姓名匹配(通配符不与ID号匹配,但请参见下面的为什么一个’*’匹配一切)。你可以改为通过包含范围指定一系列ID号码:LOW-HIGH。例如:

–usermap=0-99:nobody,wayne:admin,*:normal –groupmap=usr:1,1:usr

列表中的第一个匹配是使用的那个。你应该使用单个–usermap选项指定所有用户映射,并且使用单个–groupmap选项指定所有组映射。

请注意,0用户和组的发送者名称不会传输到接收者,所以你应该使用0匹配这些值,或者使用接收端有效的名称(通常为“root”)。所有其他的FROM名称都与发送端使用的名称相匹配。所有TO名称都与接收方使用的名称相匹配。

为了匹配的目的,在发送端没有名称的任何ID都被视为具有空名称。这允许它们通过“*”或使用空名称进行匹配。例如:

–usermap=:nobody –groupmap=*:nobody

当使用–numeric-ids选项时,发件人不会发送任何名称,因此所有ID都被视为具有空名称。这意味着如果要将这些无名ID映射到不同的值,你将需要指定数字FROM值。

要使–usermap选项有效,必须使用-o(–owner)选项(或被暗含),并且接收者需要以超级用户身份运行(另请参阅–fake-super选项)。为了使–groupmap选项有效,必须使用-g(–groups)选项(或暗含),并且接收方需要拥有设置该组的权限。

–chown=USER:GROUP
该选项强制所有文件由GROUP的USER拥有。这是一个比直接使用–usermap和–groupmap更简单的接口,但它在内部使用这些选项来实现,所以你不能混用它们。如果USER或GROUP为空,则不会发生省略用户/组的映射。如果GROUP为空,尾部冒号可以省略,但是如果USER为空,则必须提供一个冒号。

如果指定“–chown=foo:bar,这与指定”–usermap=*:foo –groupmap=*:bar“完全相同,只是更容易。

–timeout=TIMEOUT
该选项允许你以秒为单位设置最大I/O超时。如果在指定的时间内没有传输数据,则rsync将退出。缺省值是0,这意味着没有超时。

–contimeout
此选项允许你设置rsync等待与rsync守护程序的连接成功的时间。如果达到超时,rsync将退出并显示错误。

–address
默认情况下,当连接到rsync守护程序时,rsync将绑定到通配符地址。–address选项允许你指定要绑定的特定IP地址(或主机名)。另请参阅–daemon模式部分中的此选项。

–sockopts
这个选项可以为喜欢最大程度调整系统的人们提供无尽的乐趣。你可以设置各种套接字选项,这可能会使传输更快(或更慢!)。请阅读setsockopt()系统调用的手册页,以获取有关可能设置的一些选项的详细信息。默认情况下,不设置特殊的套接字选项。这只影响与远程rsync守护进程的直接套接字连接。该选项也存在于–daemon模式部分。

–blocking-io
这告诉rsync在启动远程shell传输时使用阻塞I/O。如果远程shell是rsh或remsh,则rsync默认使用阻塞I/O,否则默认使用非阻塞I/O。(请注意,ssh更喜欢非阻塞I/O。)

–outbuf=MODE
这设置输出缓冲模式。该模式可以是None(又名Unbuffered),Line,Block(又名Full)。你可以指定模式的一个字母,并使用大写或小写。

此选项的主要用途是在rsync的输出转到文件或管道时将完全缓冲更改为行缓冲。

-i, –itemize-changes
请求对每个文件进行的更改的简单逐项列表,包括属性更改。这与指定–out-format=’%i%n%L’完全相同。如果重复该选项,则也会输出未更改的文件,但只有在接收端rsync至少为版本2.6.7时(你可以对旧版本的rsync使用-vv,但也会打开其他详细消息的输出)。

“%i”转义符有11个字母长的神秘输出。通用格式类似于字符串YXcstpoguax,其中Y由正在完成的更新类型替换,X由文件类型替换,其他字母表示可能在修改时输出的属性。

替换Y的更新类型如下所示:

  • <:表示文件正在传输到远程主机(已发送)。
  • >:表示文件正在传输到本地主机(接收)。
  • c:意味着项目正在发生本地更改/创建(例如创建项目目录、更改符号链接等)。
  • h:表示该项目是与另一项目的硬链接(需要–hard-links)。
  • .:意味着该项目未被更新(尽管它可能具有正在存在的属性改性)。
  • *:表示剩余的itemized-output区域包含一条消息(例如“deleting”)。

替换X的文件类型包括:f(表示文件),d(表示目录),L(表示符号链接),D(表示设备),S(表示特殊文件。例如命名套接字、fifo)。

上面字符串中的其他字母是实际的字母,如果该项目的关联属性正在更新,或没有变化时将输出“.”。三个例外是:(1)新创建的项目用“+”替换每个字母,(2)相同的项目用空格替换点,(3)未知属性用每个字母替换“?” (这可能发生在与旧的rsync交谈时)。

与每个字母关联的属性如下所示:

  • c:表示常规文件具有不同的校验和(需要–checksum),或者符号链接、设备、特殊文件的值已更改。请注意,如果你将文件发送到3.0.1之前的rsync,则此更改标志将仅出现在校验和不同的常规文件中。
  • s:表示常规文件的大小不同,并且将通过文件传输进行更新。
  • t:表示修改时间不同,并且正在更新为发件人的值(需要–times)。T的一个替代值意味着修改时间将被设置为传输时间,当文件/符号链接/设备更新时没有–times,并且当符号链接被改变并且接收器不能设置其时间时发生。(注意:使用rsync 3.0.0客户端时,你可能会看到s标志与t相结合,而不是此时间设置失败时的正确T标志。)
  • p:表示权限不同,正在更新为发件人的值(需要–perms)。
  • o:意味着所有者不同,并且正在更新为发件人的值(要求–owner和超级用户权限)。
  • g:表示该组不同,并且正在更新为发件人的值(需要–group和设置组的权限)。
  • u:保留供将来使用。
  • a:表示ACL信息已更改。
  • x:表示扩展属性信息已更改。

另外一个输出是可能的:删除文件时,“%i”将为每个正在删除的项目输出字符串“*deleting”(假设你正在与最近版本的rsync进行通信,它将记录删除,而不是将它们输出为一个详细的消息)。

–out-format=FORMAT
这使你可以准确指定rsync客户端在每次更​​新的基础上向用户输出的内容。FORMAT是一个文本字符串,其中包含以百分号(%)字符为前缀的嵌入式单字符转义序列。如果指定了–info=name或-v,则假定缺省格式为“%n%L”(这告诉你只是文件的名称,如果该项目是链接,则是它指向的位置)。有关可能的转义字符的完整列表,请参阅rsyncd.conf联机帮助页中的“log format”设置。

指定–out-format选项隐含着–info=name选项,它将提及每个文件、目录等以一种重要方式进行更新(传输文件、重新创建的符号链接/设备、涉及的目录) 。另外,如果itemize-changes转义(%i)包含在字符串中(例如,如果使用了–itemize-changes选项),名称的记录会增加以提及以任何方式更改的项目(只要接收方至少是2.6.4)。查看–itemize-changes选项用于描述“%i”的输出。

rsync将在文件传输之前输出出格式字符串,除非要求了传输统计转义符之一,在这种情况下,日志记录在文件传输结束时完成。当这个延迟日志记录有效并且还指定了–progress时,rsync还会在其进度信息之前输出传输的文件的名称(当然,后面跟着格式输出)。

–log-file=FILE
此选项会导致rsync将其正在执行的操作记录到文件中。这类似于守护进程所做的日志记录,但可以用于客户端或者非守护进程传输的服务端。如果指定为客户端选项,则将使用默认格式“%i %n%L”启用传输日志记录。如果你想覆盖这个选项,请参阅–log-file-format选项。

以下是一个请求远程端记录正在发生的事情的示例命令:

rsync -av –remote-option=–log-file=/tmp/rlog src/ dest/

如果你需要调试连接意外关闭的原因,这非常有用。

–log-file-format=FORMAT
这使你可以准确指定每个更新日志记录的什么内容放入由–log-file选项指定的文件中(必须指定此选项才能产生任何效果)。如果你指定一个空字符串,更新的文件将不会在日志文件中提及。有关可能的转义字符的列表,请参阅rsyncd.conf联机帮助页中的“log format”设置。

如果指定了–log-file并且此选项不是’%i %n%L’,则使用默认FORMAT。

–stats
这告诉rsync打印一份关于文件传输的详细统计数据集,从而让你了解rsync的delta-transfer算法对你的数据的有效性。如果与0或1个-v选项组合,此选项等同于–info=stats2,如果与2个或更多-v选项组合,则此选项等同于–info=stats3。

目前的统计数据如下:

  • 文件数是所有“文件”(一般意义上)的计数,其中包括目录、符号链接等。计数总数后面跟着文件类型的计数列表(如果总数不为零)。例如:“(reg:5,dir:3,link:2,dev:1,special:1)”:列出了常规文件,目录,符号链接,设备和特殊文件的总数。如果有任何的值是0,它完全从列表中省略。
  • 创建文件的数量是创建了多少“文件”(一般意义上)的计数(而不是更新)。总计数后面会跟随一个按文件类型计数的清单(如果总数不为零)。
  • 已删除文件的数量是创建了多少“文件”(一般意义)的计数(而不是更新)。总计数后面会跟随一个按文件类型计数的清单(如果总数不为零)。请注意,只有在删除生效时才会输出此行,并且只有在使用协议31(rsync 3.1.x的默认设置)时才会输出此行。
  • 传输的常规文件的数量是通过rsync的delta-transfer算法(不包括目录,符号链接等)更新的普通文件的数量。请注意,rsync 3.1.0在此标题中添加了“regular”一词。
  • 文件总大小是传输中所有文件大小的总和。这不会计算目录或特殊文件的大小,但会包含符号链接的大小。
  • 总传输文件大小是传输文件的所有文件大小的总和。
  • 文字数据是我们必须发送给接收器的多少不匹配的文件更新数据,以便它重新创建更新的文件。
  • 匹配数据是接收器在重新创建更新文件时在本地获得了多少数据。
  • 文件列表大小是指发送者将其发送给接收者时文件列表数据的大小。这比rsync发送列表时由于某些压缩的重复数据而导致文件列表的内存大小要小。
  • 文件列表生成时间是发件人用于创建文件列表的秒数。这需要发送方的现代rsync来存在。
  • 文件列表传送时间是发送方花费将文件列表发送给接收方的秒数。
  • 发送的总字节数是rsync从客户端发送到服务器端的所有字节数。
  • 接收的总字节数是客户端从服务器端收到的所有非消息字节数。“非消息”字节意味着我们不会计算服务器发送给我们的详细消息的字节数,这会使统计信息更加一致。

-8, –8-bit-output
这告诉rsync保留输出中未转义的所有高位字符,而不是试图测试它们是否在当前语言环境中有效并转义无效字符。无论此选项的设置如何,所有控制字符(但绝不是制表符)都会被转义。

在2.6.7中开始的转义习惯是输出一个文字反斜杠(\)和一个井号(#),后面紧跟着三个八进制数字。例如,换行符会输出为“\#012”。文件名中的文字反斜杠不会转义,除非后面跟着井号和3位数字(0-9)。

-h, –human-readable
以更易读的格式输出数字。有三种可能的级别:(1)输出数字,每组3位数字之间有一个分隔符(逗号或句点,取决于小数点是由句点还是逗号表示); (2)以1000为单位输出数字(具有较大单位的字符后缀 – 见下文); (3)以1024为单位输出数字。

默认值是人类可读的级别1.每个-h选项将级别提高1。你可以通过指定–no-human-readable(–no-h)选项将关卡降至0(以纯数字形式输出数字)。

附加在等级2和等级3中的单位字母是:K,M,G,T。例如,一个1234567字节的文件在二级中输出为1.23M(假设一个点是你的本地小数点)。

向后兼容性注意:3.1.0版之前的rsync版本不支持可读级别1,并且它们默认为0级。因此,指定一个或两个-h选项将在旧版本和新版本中以可比较的方式运行,因为你没有在一个或多个-h选项之前指定–no-h选项。有关一个区别,请参阅–list-only选项。

–partial
默认情况下,如果传输中断,rsync将删除任何部分传输的文件。在某些情况下,更希望保留部分传输的文件。使用–partial选项告诉rsync保留部分文件,这会使文件的其余部分以更快的速度传输。

–partial-dir=DIR
保留部分文件比–partial选项更好的方法是指定一个将用于保存部分数据的DIR(而不是写出到目标文件)。在下一次传输时,rsync将使用在该目录中找到的文件作为数据来加速传输的恢复,然后在它达到其目的后将其删除。

请注意,如果指定(或隐含)指定了–whole-file,则在DIR中到了用于正在更新的文件,会直接删除(因为rsync在不使用rsync的delta-transfer算法的情况下发送文件)。

如果rsync丢失(只是最后一个目录 – 不是整个路径),它将创建DIR。这使得使用相对路径(例如“–partial-dir=.rsync-partial”)可以很容易地让rsync在需要时在目标文件的目录中创建partial-directory,然后在部分文件被删除是删除该目录。

如果partial-dir值不是绝对路径,则rsync将在所有现有排除项末尾添加排除规则。这样可以防止发送端可能存在的任何部分目录文件被发送,并且还可以防止在接收端不及时删除部分目录项。一个例子:上面的–partial-dir选项会在任何其他过滤规则的末尾添加“-f’-p .rsync-partial/’”等效项。

如果你提供了自己的排除规则,则可能需要为partial-dir添加你自己的排除/隐藏/保护规则,因为(1)自动添加的规则可能在其他规则末尾无效,或者(2 )你可能希望覆盖rsync的排除选项。例如,如果你想让rsync清理掉可能存在的剩余部分dir,你应该指定–delete-after并添加一个“risk”过滤规则,例如, -f’R .rsync-partial/’。(避免使用–delete-before或–delete-during,除非在当前运行过程中不需要使用rsync来使用任何剩余的部分目录数据。)

重要提示:–partial-dir不应该被其他用户写入,否则存在安全风险。例如:避免“/tmp”。

你也可以将partial-dir值设置为rsync_PARTIAL_DIR环境变量。在环境中进行设置不会强制–partial启用,但它会影响部分文件在指定–partial时的位置。例如,你可以在你的环境中设置rsync_PARTIAL_DIR=.rsync-tmp,而不是使用–partial-dir=.rsync-tmp和–progress,然后使用-P选项打开.rsync-tmp dir用于部分传输。只有以下情况使–partial选项不查找这个环境值:(1)当–inplace被指定时(因为–inplace与–partial-dir冲突),以及(2)当–delay-updates被指定(见下文)。

对于守护进程配置的“refuse options”设置,–partial-dir并不包含–partial。这样可以拒绝使用–partial选项来禁止使用部分传输覆盖目标文件,同时仍允许由–partial-dir提供的更安全的语言。

–delay-updates
该选项将每个更新文件中的临时文件放入保存目录中,直到传输结束,此时所有文件都将被快速连续重命名。这试图使文件的更新更加原子化。默认情况下,这些文件将放置在每个文件的目标目录中名为“.~tmp~”的目录中,但是如果指定了–partial-dir选项,则将使用该目录。请参阅–partial-dir部分中的注释,以讨论如何将“.~tmp~”目录从传输中排除,以及如果你想要rsync清除旧的周围的“.~tmp~”目录。与–inplace和–append冲突。

此选项在接收端使用更多内存(每个文件传输一位),并且在接收端还需要足够的可用磁盘空间来容纳所有更新文件的附加副本。另请注意,不应该使用–partial-dir的绝对路径,除非(1)传输中的任何文件没有相同名称的机会,(因为所有更新的文件都将放入单个目录中,且路径是绝对路径);(2)层次结构中没有挂载点(因为如果它们不能重命名到位,延迟更新将失败)。

另请参阅“support”子目录中的“atomic-rsync”perl脚本,以获取更原子化的更新算法(它使用–link-dest和文件的并行层次结构)。

-m, –prune-empty-dirs
此选项告诉接收rsync从文件列表中删除空目录,包括没有非目录子目录的嵌套目录。这对于避免在发送rsync使用include / exclude / filter规则递归扫描文件层次结构时创建大量无用目录很有用。

请注意,使用传输规则(如–min-size选项)不影响进入文件列表的内容,因此即使目录中的文件都不符合传输规则,也不会留空目录。

由于文件列表实际上正在修剪,因此此选项也会影响删除处于活动状态时删除的目录。但是,请记住,排除的文件和目录可以防止由于排除隐藏源文件和保护目标文件而导致现有项目被删除。有关如何避免这种情况,请参阅易腐过滤规则选项。

你可以使用全局“protect”过滤器防止从文件列表中删除某些空目录。例如,这个选项将确保目录“emptydir”保存在文件列表中:

–filter ’protect emptydir/’

下面是一个示例,它将所有.pdf文件复制到层次结构中,仅创建必要的目标目录以容纳.pdf文件,并确保删除目标中的多余文件和目录(请注意,正在使用的非目录的隐藏过滤器而不是排除规则):

rsync -avm –del –include=’*.pdf’ -f ’hide,! */’ src/ dest

如果你不想删除多余的目标文件,–include =’*/’ –exclude =’*’这些更老的选项可以很好地代替隐藏过滤器(如果是对你更自然)。

–progress
该选项告诉rsync打印显示传输进度的信息。这给无聊的用户提供了一些值得关注的东西。使用现代的rsync,这与指定–info=flist2,name,progress相同,但是任何用户提供的设置的这些info标志的是优先(例如“–info=flist0 –progress”)。

当rsync传输一个普通文件时,它会更新一个如下所示的进度行:

782448 63% 110.64kB/s 0:00:04

在这个例子中,接收机重建了782448字节或发送方文件的63%,正在以每秒110.64kB的速率重建,如果当前速率一直保持到最后,传输将在4秒内完成。

如果使用rsync的增量转移算法,这些统计数据可能会引起误解。例如,如果发件人的文件由基础文件和附加数据组成,则当接收者获得文字数据时,报告的速率可能会急剧下降,并且该传输可能需要更长的时间才能完成,因为它是估计的,因为它是完成文件的匹配部分。

当文件传输完成时,rsync用如下所示的摘要行替换进度行:

1,238,099 100% 146.38kB/s 0:00:08 (xfr#5, to-chk=169/396)

在这个例子中,文件的总长度为1,238,099字节,整个文件的平均传输速率为每秒146.38千字节,在完成8秒后完成,这是当前rsync期间第5次传输常规文件的会话,并且还有169个文件供接收方检查(以查看它们是否是最新的),剩余文件列表中的396个文件。

在增量递归扫描中,rsync在到达扫描结束时才会知道文件列表中的文件总数,但由于它在扫描过程中开始传输文件,因此它将显示一行文本“ir-chk“(用于增量递归检查),而不是”to-chk“,直到它知道列表的全部大小,此时它将切换到使用”to-chk“。因此,查看“ir-chk”可以让你知道文件列表中的文件总数仍将增加(并且每次执行该操作时,剩下要检查的文件的数量将增加所添加的文件的数量列表)。

-P
-P选项相当于–partial –progress。其目的是为了可以中断长时间传输而指定这两个选项更容易。

还有一个–info=progress2选项,用于输出基于整个传输的统计信息,而不是单个文件。如果你想查看传输如何进行而不用滚动屏幕上的大量名称,不输出文件名的使用此标志而(例如,避免-v或指定–info = name0)。(你不需要指定–progress选项以便使用–info=progress2。)

–password-file=FILE
此选项允许你通过文件来提供访问rsync守护进程时需要使用的密码,如果FILE为“-”,则从stdin中读取密码。应该将密码保存在FILE中的第一行(因为其他行都会被忽略)。如果FILE是所有人可读的,或者root运行的rsync命令找到非root所属的文件,则rsync将退出并显示错误。

该选项读取的密码不会用在远程shell的认证中。以ssh为例,当使用ssh作为传输来访问rsync守护程序时,ssh要先进行认证,这个认证属于ssh层的认证,比如使用ssh -p来提供ssh认证时使用的密码,在ssh完成身份验证后,再使用此选项提供的密码用于rsync层的认证(如果你还在rsync守护程序的配置文件中配置了密码认证)。关于如何提供远程shell的密码,请参阅远程shell的文档。

–list-only
此选项将导致源文件被列出而不是传输。如果只有一个源参数并且没有指定目的地,则默认使用此选项,因此其主要用途是:(1)将包含目标参数的复制命令转变为文件列表命令,或(2)能够指定多个源参数(注意:一定要包含目的地)。警告:请记住,带有通配符的源参数被shell扩展为多个参数,因此尝试列出此参数而不使用此选项是不安全的。例如:

rsync -av –list-only foo* dest/

从rsync 3.1.0开始,由–list-only输出的大小会受到–human-readable选项的影响。默认情况下,它们将包含数字分隔符,但较高级别的可读性将输出带有单位后缀的大小。还要注意,对于所有人类可读的级别,大小输出的列宽已从11个增加到14个字符。如果你只需要大小的数字,并且旧的列宽为11个字符,请使用–no-h。

兼容性说明:当请求版本为2.6.3或更低版本的rsync的远程文件列表时,如果你要求提供非递归列表,则可能会遇到错误。这是因为文件列表意味着–dirs选项无–recursive,并且较旧的rsyncs没有该选项。为避免此问题,可以指定–no-dirs选项(如果不需要扩展目录的内容),或者打开递归并排除子目录的内容:-r –exclude=’/*/*’。

–bwlimit=RATE
此选项允许你指定通过套接字发送的数据的最大传输速率,单位为每秒。RATE值可以用一个字符串作为后缀以指示大小乘数,并且可以是小数值(例如“–bwlimit=1.5m”)。如果没有指定后缀,则该值将被假定为以1024个字节为单位(就像添加了“K”或“KiB”一样)。有关所有可用后缀的说明,请参阅–max-size选项。零值指定没有限制。

出于向后兼容性的原因,速率限制将舍入到最接近的KiB单位,因此速率小于1024字节/秒是不可能的。

rsync以块为单位在套接字上写入数据,并且此选项同时限制rsync写入块的大小,并尝试将平均传输速率保持在请求的限制。有些“突发”可能出现在rsync写出数据块然后进入休眠以使平均速率符合规定。

由于数据的内部缓冲,–progress选项可能无法准确反映数据发送的速度。这是因为当数据被快速缓冲时,某些文件可能会显示为快速发送,而当输出缓冲区发生刷新时,其他文件会显示为非常慢。这可能会在未来版本中修复。

–stop-at=y-m-dTh:m
此选项允许你指定在什么时间停止rsync,以year-month-dayThour:minute数字格式(例如2004-12-31T23:59)。你可以指定一个2位或4位数的年份。你也可以忽略各种项目,并且结果将是与指定数据匹配的下一个可能时间。例如,“1-30”:下一个1月30日(午夜),“04:00”指定下一个上午4点,“1”指定在午夜的下一个月份的第一天,“:59”指定下一个第59分钟。如果你愿意,你可以使用斜杠而不是破折号分隔日期数字。

–time-limit=MINS
允许rsync运行最多MINS分钟。

–write-batch=FILE
记录一个文件,稍后可以通过–read-batch应用于另一个相同的目的地。有关详细信息,请参阅“BATCH MODE”一节,以及–only-write-batch选项。

–only-write-batch=FILE
像–write-batch一样工作,除了在创建批处理时不在目标系统上进行更新。这使你可以通过其他方式将更改传输到目标系统,然后通过–read-batch应用更改。

请注意,你可以随意将批处理直接写入一些便携式媒体:如果此媒体在传输结束之前填充到容量,则可以将该部分传输应用到目标,并重复整个过程以获取剩余的 更改(只要在多更新周期发生时,你不介意部分更新的目标系统)。

另外请注意,当将更改推送到远程系统时,你只能节省带宽,因为这样可以将批处理数据从发送方转移到批处理文件中,而无需通过线路流向接收方(在拉取时,发送方是远程的, 从而不能写入批处理)。

–read-batch=FILE
应用存储在FILE中的所有更改,这是以前由–write-batch生成的文件。如果FILE为-,批处理数据将从标准输入读取。详细信息请参见“BATCH MODE”部分。

–protocol=NUM
强制使用较旧的协议版本。这对于创建与较早版本的rsync兼容的批处理文件很有用。例如,如果rsync 2.6.4与–write-batch选项一起使用,但rsync 2.6.3将用于运行–read-batch选项,则应使用“–protocol=28” 创建批处理文件时强制在批处理文件中使用较旧的协议版本(假设你无法升级读取系统上的rsync)。

–iconv=CONVERT_SPEC
rsync可以使用此选项在字符集之间转换文件名。使用“.”的CONVERT_SPEC通知rsync通过区域设置查找默认字符集。或者,你可以通过给出以逗号分隔的本地和远程字符集(–iconv=LOCAL,REMOTE)来完全指定要执行的转换,例如, –iconv=UTF8,ISO88591。此顺序可确保无论你推送还是拉取文件,该选项都将保持不变。最后,你可以指定–no-iconv或为“-”的CONVERT_SPEC关闭任何转换。此选项的默认设置是特定于站点的,也可以通过rsync_ICONV环境变量影响。

有关本地iconv库支持什么字符集名称的列表,你可以运行“iconv –list”。

如果你指定–protect-args选项(-s),则rsync将转换你在命令行上指定的发送到远程主机的文件名。另请参阅–files-from选项。

请注意,rsync不会对过滤器文件(包括包含/排除文件)中的名称进行任何转换。你需要确保你指定的匹配规则可以匹配转移的两端。例如,如果在双方存在需要考虑的文件名差异,则可以指定额外的包含/排除规则。

当你将一个–iconv选项传递给一个允许它的rsync守护进程时,守护进程将使用在其“charset”配置参数中指定的字符集,而不考虑实际传递的远程字符集。因此,你可以随意指定守护进程传输的本地charset(例如–iconv=utf8)。

-4, –ipv4, -6, –ipv6
在创建套接字时告诉rsync使用IPv4/IPv6。这仅影响rsync直接控制的套接字,例如直接联系rsync守护程序时的传出套接字。另请参阅–daemon模式部分中的这些选项。

如果在不支持IPv6的情况下编译rsync,–ipv6选项将不起作用。–version输出会告诉你是否是这种情况。

–checksum-seed=NUM
将校验和种子设置为整数NUM。这4个字节的校验和种子包含在每个块和MD4文件校验和计算中(更现代的MD5文件校验和不使用种子)。默认情况下,校验和种子由服务器生成,默认为当前时间time()。此选项用于设置特定的校验和种子,这对于需要可重复块校验和的应用程序非常有用,或者在用户需要更多随机校验和种子的情况下。将NUM设置为0会导致rsync将time()的默认值用于校验和种子。

-r, –recursive
这告诉rsync递归地复制目录,复制目录时要使用该选项,否则目录会被跳过。另见–dirs(-d)选项。

从rsync 3.0.0开始,所使用的递归算法现在是一种增量扫描,它比以前使用的内存少得多,并在完成前几个目录的扫描之后开始传输。这种增量扫描只会影响我们的递归算法,并不会改变非递归传输。当传输的两端至少为3.0.0版时才可以。

某些选项需要rsync知道完整的文件列表,因此这些选项会禁用增量递归模式。这些包括: –delete-before, –delete-after, –prune-empty-dirs, –delay-updates。因此,当指定–delete时,现在默认的删除模式是–delete-during,当连接的两端至少为3.0.0时(使用–del或–delete-during明确要求使用改进的删除模式)。另请参阅–delete-delay选项,这比使用–delete-after更好。

增量递归可以使用–no-inc-recursive选项或其更短的–no-i-r来禁用。

-l, –links
指定该选项后,如果遇到符号链接,则在目标上重建符号链接。

-L, –copy-links
指定该选项后,在遇到符号链接时,复制它们指向的项目,而不是符号链接本身。
在旧版本的rsync中,这个选项也有副作用:会告诉接收端遵循符号链接的,比如到目录符号链接,而不是符号连接指向的项目。在现代的rsync中,需要指定–keep-dirlinks(-K)才能获得此行为。当然如果rsync的版本旧到无法理解-K选项,在这种情况下,-L选项在旧的rsync接收端上仍然具有-K的副作用。

-f, –filter=RULE
此选项允许你添加规则,这些规则以选择性地从要传输的文件列表中排除某些文件。这与递归传输结合使用时非常有用。

你可以在命令行上使用多个–filter选项来构建出要排除的文件列表。如果RULE中包含空格,需要使用引号来饮用它,以便shell将RULE作为单个参数传递给rsync。下面的文字还提到你可以使用下划线替换空格,将规则与参数分开的。

有关此选项的详细信息,请参阅FILTER RULES部分。

-F
-F选项是两个–filter规则的简写。第一次使用-F时,代表:

–filter =’dir-merge /.rsync-filter’

这告诉rsync查找已经分散在层次结构中的每个目录.rsync-filter文件,并使用它们的规则来过滤传输中的文件。如果-F重复出现,则代表:

–filter =’exclude .rsync-filter’

这会从传输中滤除.rsync过滤器文件本身。

有关这些选项如何工作的详细信息,请参阅FILTER RULES部分。

–exclude=PATTERN
此选项是–filter选项的简化形式,默认为排除规则。PATTERN不允许使用常规筛选规则的完整规则解析语法。

有关此选项的详细信息,请参阅FILTER RULES部分。

–exclude-from=FILE
此选项与–exclude选项相关,但该选项用于指定一个包含排除模式的文件FILE(每行一个规则)。文件中的空行及以’;’或’#’开头的行将被忽略。如果FILE是-,则从stdin中读取排除规则。

–include=PATTERN
此选项是–filter选项的简化形式,默认为包含规则。PATTERN不允许使用常规筛选规则的完整规则解析语法。

有关此选项的详细信息,请参阅FILTER RULES部分。

–include-from=FILE
此选项与–include选项有关,但该选项用于指定一个包含模式的文件FILE(每行一个规则)。文件中的空行以及’;’或’#’开头的行将被忽略。如果FILE是-,则从stdin中读取包含规则。

–port=PORT
指定要连接的RSYNC服务的端口号,而不是使用默认的873端口。仅在使用双冒号语法(rsync [OPTION…] [USER@]HOST::SRC… [DEST])时,才需要使用此选项,而URL语法(rsync [OPTION…] rsync://[USER@]HOST[:PORT]/SRC… [DEST])可以直接指定端口号。另请参阅–daemon模式中的–port选项。

调试与输出

-v, –verbose
在文件传输时,给出更多的信息:

  • 默认,rsync没有输出。
  • 使用-v时,会给正在传输的文件,并在结尾给出一个简短的描述。
  • 使用两次-v选项时,会显示将要跳过的文件,以及结尾会显示再稍微多一点的信息。
  • 一般在进行rsync的debug时才会使用超过两次的-v选项。

在新的rsync中,-v选项等同于同时设置–info和–debug。除了–verbose之外,还可以选择使用这些新的选项,因为任何更细粒度的设置都会覆盖-v的隐含设置。–info和–debug都有请求帮助的办法,用于告诉你为每个增加的详细信息设置什么标识。

然而,守护进程的”max verbosity“设置将限制在守护进程端各种标志的最大值。例如,如果最大值是2,那么任何比-vv设置的值更高的信息及调试标志都将被降级为守护进程日志中的-vv级别。

其他选项

–help
打印一个简短帮助页面然后退出。为了向后兼容,使用不带任何参数的-h选项也会打印出帮助页面。

–version
打印版本号并退出。

命令支持的选项及含义:守护进程相关

–daemon
这告诉rsync它将作为守护进程运行。 您可以使用host::module或rsync://host/module/语法使用rsync客户端访问运行的守护进程。

如果标准输入是套接字,那么rsync将假定它正在通过inetd运行,否则它将从当前终端分离并成为后台守护进程。 守护进程将读取客户端建立的每个连接上的配置文件(rsyncd.conf),并相应地响应请求。 有关更多详细信息,请参阅rsyncd.conf(5)手册页。

–address
默认情况下,在使用–daemon选项作为后台进程运行时,rsync将绑定到通配符地址。 –address选项允许您指定要绑定的特定IP地址(或主机名)。 这使虚拟主机可以与–config选项结合使用。 另请参阅rsyncd.conf联机帮助页中的“address”全局选项。

–bwlimit=RATE
该选项允许您指定守护进程通过套接字发送的数据的最大传输速率。 客户端仍然可以指定一个更小的–bwlimit值,但不允许更大的值。 查看该选项的客户端版本(以上)了解一些额外的细节。

–config=FILE
指定在rsync以守护进程方式运行(使用–daemon选项)时所使用的配置文件。如果未指定,则默认使用/etc/rsyncd.conf文件,当然具体的默认配置文件加载路径与编译选项有关。另外,如果守护进程通过远程SHELL程序运行,并且远程用户不是超级用户;在这种情况下,当前目录中的rsyncd.conf为默认的配置文件(通常为$HOME)。

-M, –dparam=OVERRIDE
在守护进程模式下启动rsync时,可以使用此选项设置守护进程配置参数。 它相当于在第一个模块定义之前的全局设置结束处添加参数。如果您愿意,参数名称可以不带空格指定。 例如:

rsync –daemon -M pidfile=/path/rsync.pid

–no-detach
当作为守护进程运行时,此选项指示rsync不会自行分离并成为后台进程。 在Cygwin上作为服务运行时,需要此选项,并且当rsync由程序(如daemontools或AIX的系统资源控制器)监督时也可能有用。在调试器下运行rsync时,也建议使用–no-detach。 如果rsync是从inetd或sshd运行的,则此选项不起作用。

–port=PORT
这指定守护进程监听的替代TCP端口号而不是缺省值873。另请参阅rsyncd.conf联机帮助页中的“port”全局选项。

–log-file=FILE
该选项告诉rsync守护进程使用给定的日志文件名FILE,而不是使用配置文件中的“log file”设置。

–log-file-format=FORMAT
该选项告诉rsync守护进程使用给定的FORMAT字符串,而不是使用配置文件中的“log format”设置。 它还启用“transfer logging”,除非字符串为空,在这种情况下传输日志记录被关闭。

–sockopts
这将覆盖rsyncd.conf文件中的套接字选项设置,并具有相同的语法。

-v, –verbose
该选项增加守护进程在其启动阶段记录的信息量。 客户端连接后,守护程序的详细级别将由客户端使用的选项以及模块配置部分中的”max verbosity”设置来控制。

-4, –ipv4, -6, –ipv6
在创建rsync守护程序将用于侦听连接的传入套接字时,告诉rsync更喜欢IPv4 / IPv6。 在旧版本的Linux中,可能需要其中一种选项来解决内核中的IPv6错误(如果在没有其他使用端口的情况下看到“address already in use”错误,请尝试指定–ipv6或–ipv4 当启动守护进程时)。

如果在不支持IPv6的情况下编译rsync,–ipv6选项将不起作用。 –version输出会告诉你是否是这种情况。

-h, –help
在–daemon之后指定–help时,可以打印一个简短的帮助页面,描述可用于启动rsync守护程序的选项。

过滤器规则

过滤规则,用于灵活地选择要包含(include)的文件以及要排除(exclude)的文件。过滤规则:可以是直接指定的包含/排除模式;或者是获取更多包含/排除模式的方法(例如,从文件中读取过滤规则)。

由于要传输的文件/目录列表已经建立,rsync会依次针对包含/排除模式列表来检查每个要传输的文件名称,并且首先匹配的模式会被执行

  • 如果它是排除模式,则跳过文件;
  • 如果它是包含模式,则包含文件;
  • 如果找不到匹配的模式,则包含文件;

根据命令行上的指定的过滤规则,rsync会使用它们来构建一个过滤规则的有序列表。过滤规则的语法如下:

RULE [PATTERN_OR_FILENAME]

RULE,MODIFIERS [PATTERN_OR_FILENAME]

其中,RULE为规则,比如:exclude(排除)、include(包含)、merge(合并文件里的规则到当前文件);MODIFIERS为修饰符,是可选的;PATTERN_OR_FILENAME为参数,代表文件名或者模式。

RUEL有两种形式:长命名;短命名。如果使用短命名的RULE,则将RULEMODIFIERS分开的逗号(,)是可选的。后面的PATTERN_OR_FILENAME(如果存在)必须位于单个空格( )或下划线(_)之后。以下是可用的RULE取值及含义(长命名形式,括号中的为短命名):

  • exclude(-):指定一个排除模式;
  • include(+):指定一个包含模式;
  • merge(.):指定一个合并文件,用于读取更多的规则;
  • dir-merge(:):指定每个目录的合并文件;
  • hide(H):指定一个模式,用于从传输中隐藏文件;
  • show(S):不隐藏匹配模式的文件;
  • protect(P):指定一个模式,该模式保护文件避免被删除;
  • risk(R):匹配模式的文件不受保护;
  • clear(!):清除当前的包含/排除列表,无需参数;

当从文件中读取规则(使用merge或者dir-merge)时,空白的行和以井号(#)开始的行会被忽略。

注意事项

选项–include/–exclude(–include-from/–exclude-from)不允许全部范围如上所述的规则解析,它们只允许指定:包含模式(include);排除模式(exclude);清除列表(clear)(以及从文件读取规则时的普通注释解析)。

如果规则不以“- ”或“+ ”(加号,空格)开头,则:使用include选项时,该规则将会被前缀”+ “;使用exclude选项时,该规则会被前缀”- “。

另一方面,对于用于–filter选项的规则,在规则开始时必须始终包含一个短命名或长命名的RULE名。

另请注意,选项–filter、–include、–exclude都只能携带一个规则,如果要添加多个规则,可以在命令行上重复使用这些选项。或者使用–filter选项的合并文件规则(merge或者dir-merge)。又或–include-from/–exclude-from选项。

包含/排除模式规则(inlcude/exclude)

你可以通过使用include(+)、exclude(-)等过滤规则指定模式来包含和排除文件。include/exclude规则分别指定了一个模式,该模式用于和要传输的文件的名称进行匹配。这些模式由以下几种形式:

如果模式以/开始,则它锚定到文件层次结构中的特定位置,否则它将与路径名的末尾匹配。这与正则表达式中的前导“^”类似。因此,“/foo”将在“传输根目录”(全局规则)或合并文件目录(对于每个目录规则)中匹配“foo”的名称。一个不合格的“foo”会在树中的任何位置匹配“foo”的名称,因为该算法是从上到下递归应用的;它的行为就好像每个路径组件都在文件名的末尾处转弯一样。即使未锚定的“sub/foo”也会在层次结构中的任何一个点上匹配,其中在名为“sub”的目录中找到了“foo”。有关如何指定与传输根目录匹配的模式的完整讨论,请参阅“ANCHORING INCLUDE/EXCLUDE PATTERNS”一节;

如果模式以“/”结尾,那么它只会匹配一个目录,而不是常规文件、符号链接、设备;

通过检查模式中是否含有“*”、“?”、“[”三个通配符之一,rsync来决定对字符串执行简单字符串匹配还是通配符匹配;

字符“*”会匹配任何路径组件,但它在斜线处停止(即不匹配斜线);

字符组“**”会匹配任何内容,包括斜杠(/)在内;

字符“?”匹配任何字符,但是除斜杠(/)以外;

字符“[”用于引入了一个字符类,如[a-z][[:alpha:]]

可以使用反斜线来转义通配符。比如,要在字符串使用问号(?),需要指定为“\?”。但是,当反斜线转义的字符不是通配符时,它会按照字面匹配,此时就产生了一个额外的反斜线删除。例如,“foo\bar”会被解释为“foobar”,因为通配符“\b”并不存在。因此,“foo\bar”正确的表示法为“foo\\bar”。

如果模式包含“/”(不包括“/”在尾部的情况)或“**”,则它将与完整路径名相匹配,包括任何主目录。如果该模式不包含“/”或“**”,则它仅与文件名的最后一个组件匹配。(请记住,该算法是递归应用的,所以“完整文件名”实际上可以是从开始目录到下一个路径的任何部分)。

尾随的”dir_name/***“将与目录(如同指定了“dir_name/”)和目录中的所有内容(如同指定了”dir_name/**“)一样匹配。此行为已在版本2.6.7中添加。

请注意,使用–recursive(-r)选项时,每个路径的每个子组件都是从上到下访问的,因此包含/排除模式将递归应用于每个子组件的全名(例如 为了包含“/foo/bar/baz”,子组件“/foo”和“/foo/bar”一定不能被排除)。当rsync找到要发送的文件时,排除模式实际上会短路目录遍历阶段。如果某个模式排除了特定的父目录,则它可能无效地呈现更深的包含模式,因为层次结构的排除部分导致rsync未进行下降。这在使用尾随“*”规则时尤为重要。例如,这不起作用:

+ /some/path/this-file-will-not-be-found

+ /file-is-included

– *

这会失败,因为父目录“some”被’*’规则排除,所以rsync从不会访问“some”或“some/path”目录中的任何文件。一种解决方法是通过使用单个规则来请求层次结构中的所有目录:“+ */”(将它放在“- *”规则之前的某处),并且可能使用–prune-empty-dirs选项。另一种解决方案是为所有需要访问的父级目录添加特定的包含规则。例如,如下这套规则工作正常:

+ /some/

+ /some/path/

+ /some/path/this-file-is-found

+ /file-also-included

– *

以下是排除/包含匹配的一些示例:

– *.o:排除所有名字匹配*.o的;

– /foo:排除传输根目录中的名为foo的文件或者目录;

– foo/:排除所有名为foo的目录;

– /foo/*/bar:排除所有传输根目录中的foo下的某个目录下的bar文件(或者目录);

– /foo/**/bar:排除所有传输根目录中的foo下的某个(或多个)目录下的bar文件(或者目录);

+ */、+ *.c、- *:这三个选项相结合,将排除所有除了C语言源文件之外的所有文件和目录;

+ foo/、+ foo/bar.c、- *:只会包含foo目录,及foo下的bar.c文件。(foo目录必须被明确的包含,否则会被“- *”排除掉);

下面是include或exclude规则可以使用的修饰符(MODIFIERS):

  • /:指定包含/排除规则应与当前项的绝对路径名相匹配。例如,在传输从“/etc”目录发送文件时,“-/ /etc/passwd”会排除passwd文件,并且“-/ subdir/foo”,当foo位于命名为“subdir”的目录时被排除,即使“foo”是当前传输的根。
  • !:指定如果模式不匹配时,则包含/排除应该生效。例如,“-! */”会排除所有非目录。
  • C:用于表示应将所有全局CVS排除规则应作为排除规则插入到“-C”所在的位置。无需跟随参数。
  • s:用于指示该规则适用于发送方。当规则影响发送端时,它会阻止文件传输。默认情况下,规则会影响双方,除非指定了–delete-excluded,在这种情况下,默认规则仅成为发送方。另请参阅隐藏(H)和显示(S)规则,这是指定发送方包含/排除的备用方法。
  • r:用于表示该规则适用于接收端。当规则影响接收端时,它会阻止文件被删除。有关更多信息,请参阅s修饰符。另请参阅保护(P)和风险(R)规则,这是规定接收端包括/排除的备用方法。
  • p:表示规则是易腐的,这意味着它在被删除的目录中被忽略。例如,-C选项的排除诸如“CVS”和“*.o”之类的默认规则将被标记为易腐烂,并且不会阻止源上已删除的目录在目标上被删除。

合并文件过滤器规则(merge/dir-merge)

可以通过指定merge或dir-merge规则,来将指定文件中的过滤规则合并到当前过滤规则中。

对于merge:被合并进来的文件只被读取一次,并将其规则合并到过滤器列表中的merge规则所在位置的。如果文件不存在,则会产生错误。对于dir-merge:rsync会为命名的文件扫描它遍历的每个目录,文件存在时,将其内容合并到当前的继承规则列表中。这些每个目录的规则文件必须在发送端创建,因为它是正在扫描可用文件传输的发送端。如果你希望它们影响哪些文件不会被删除,则这些规则文件可能还需要传输到接收端(请参阅下面的PER-DIRECTORY RULES AND DELETE部分)。

如下示例:

merge/etc/rsync/default.rules

./etc/rsync/default.rules

dir-merge .per-dir-filter

dir-merge,n- .non-inherited-per-dir-excludes

:n- .non-inherited-per-dir-excludes

merge或者dir-merge可以接受以下的修饰符:

  • – :指定该文件应该仅包含排除模式,除了文件内注释以外不需要其他规则解析。
  • + :指定该文件应该仅含有包含模式,除了文件内注释以外不需要其他规则解析。
  • C :指定应该以CVS兼容方式读取文件。这会打开’n’、’w’、’-‘,但也允许指定列表清除标记(!)。如果没有提供文件名,则假定“.cvsignore”。
  • e :将从传输中排除合并文件;例如“dir-merge,e .rules”等价于“dir-merge .rules”和“- .rules”。
  • n :指定规则不被子目录继承。
  • w :指出规则是用空白字符分隔,而不是普通的行分隔。这也关闭了注释。注意:将前缀与规则分开的空格被专门处理,因此“- foo + bar”被解析为两个规则(假设前缀解析也未被禁用)。
  • 你也可以为上面的“+”或“-”规则指定任何修饰符,以使从文件读入的规则具有该修饰符集(除了!修饰符,它不会有用)。例如,“merge,-/.excl”会将.excl的内容视为绝对路径的排除规则,而“dir-merge,s .filt”和“:sC”将使每个目录的所有规则都用在发送方。如果合并规则中已经指定要影响的端(通过s、r修饰符,或两者),则文件中的规则不能再指定端(通过修饰符或规则前缀,如hide)。

除非使用了’n’修饰符,否则每个目录规则都会被继承,继承者为找到合并文件的目录的所有的子目录。每个子目录的规则都前缀到从其父母继承来的每个目录规则,这使得最新规则的优先级高于继承的规则。整个dir-merge规则集合在合并文件的指定位置处,因此可以通过全局规则列表中前面指定的规则来覆盖目录合并的规则。从每个目录文件中读取到列表清除规则(“!”)时,它只会为当前合并文件清除继承的规则。

阻止dir-merge文件中的单个规则被继承的另一种方法是使用前导斜杠来锚定那个规则,因为每个目录的合并文件中的被锚定的规则都是相对于合并文件所在的目录的,因此模式“/foo”只会匹配找到合并文件的目录中的“foo”文件。

下面是一个通过–filter=”. file”进行指定过滤文件示例:

merge/home/user/.global-filter

– *.gz

dir-merge .rules

+ *.[ch]

– *.o

这将合并列表开头的/home/user/.global-filter文件的内容,并将“.rules”文件名转换为每个目录的过滤器文件。在目录扫描开始之前读入的所有规则都跟在全局锚定规则后(即前导斜线匹配传输的根)。

如果每个目录的合并文件的前面使用了一个路径,且该路径是第一个传输目录的父目录,则rsync将从该起始位置向所指示的每个目录文件的传输目录扫描所有父目录。例如,这是一个常用的过滤器(参见-F):

–filter=’:/.rsync-filter’

该规则告诉rsync在作为部分发送目录中的文件的正常目录扫描开始之前,从根部向下扫描文件中的.rsync-filter文件。(注意:对于rsync守护进程,根始终与模块的“path”相同。)

针对每个目录文件的这种预扫描的一些示例:

rsync -avF/src/path//dest/dir

rsync -av –filter=’: ../../.rsync-filter’/src/path//dest/dir

rsync -av –filter=’: .rsync-filter’/src/path//dest/dir

在正常扫描开始在“/src/path”及其子目录中查找文件之前,上面的前两个命令将在“/”和“/src”中查找“.rsync-filter”。最后一个命令避免了父目录扫描,只查找每个是传输一部分的目录中的“.rsync-filter”文件。

如果要在模式中包含“.cvsignore”的内容,则应使用规则“:C”,该规则会创建.cvsignore文件的dir-merge,但会以CVS兼容的方式进行解析。你可以通过将“:C”放置在过滤规则中的任何位置来影响–cvs-exclude(-C)选项包含的每个目录.cvsignore文件的放置位置。如果没有这个,rsync会在所有其他规则的末尾为.cvsignore文件添加dir-merge规则(赋予它低于命令行规则的优先级)。例如:

cat <<EOT | rsync -avC –filter=’. -‘ a/b

+ foo.o

:C

– *.old

EOT

rsync -avC –include=foo.o -f :C –exclude=’*.old’ a/b

上述两个rsync命令都是相同的。每个人都会在列表中间合并所有每个目录的.cvsignore规则,而不是最后。这允许他们的特定于目标的规则取代遵循以下规则的规则:C,而不是服从所有规则。为了影响其他CVS排除规则(例如,默认的排除列表,$HOME/.cvsignore的内容和$CVSIGNORE的值),你应该省略-C命令行选项,而是插入一个“-C”到的过滤规则中; 例如“–filter=-C”。

列表清除过滤器规则(clear)

你可以使用“!”过滤规则来清除当前的包含/排除列表 (如上面的FILTER RULES部分所介绍)。“当前”列表可以是全局规则列表(如果解析过滤器选项时遇到规则),也可以是一组每个目录规则(它们在它们自己的子列表中继承,因此子目录可以使用它清除父母的规则)。

锚定包含/排除模式

如前所述,全局包含/排除模式固定在“传输的根”(而不是每个目录模式,它们位于合并文件的目录中)。如果将传输视为从发送者发送到接收者的名称的子树,则传输根目录是树在目标目录中开始被复制的位置。这个根管理着以/匹配开头的模式。

因为匹配与传输根目录相关,所以更改源路径上的尾部斜线或更改对–relative选项的使用会影响你在匹配中需要使用的路径(此外,改变在目标主机上被复制文件树的多少)。以下示例说明了这一点。

假设我们想匹配两个源文件,一个是绝对路径“/home/me/foo/bar”,另一个是路径为“/home/you/bar/baz的文件。以下是对于双源传输的各种命令选择的不同之处:

	# rsync -a/home/me/home/you/dest
	+/- pattern:/me/foo/bar
	+/- pattern:/you/bar/baz
	Target file:/dest/me/foo/bar
	Target file:/dest/you/bar/baz

	# rsync -a/home/me//home/you//dest
	+/- pattern:/foo/bar               (note missing "me")
	+/- pattern:/bar/baz               (note missing "you")
	Target file:/dest/foo/bar
	Target file:/dest/bar/baz

	# rsync -a --relative/home/me//home/you/dest
	+/- pattern:/home/me/foo/bar       (note full path)
	+/- pattern:/home/you/bar/baz      (ditto)
	Target file:/dest/home/me/foo/bar
	Target file:/dest/home/you/bar/baz

	# cd/home; rsync -a --relative me/foo you//dest
	+/- pattern:/me/foo/bar      (starts at specified path)
	+/- pattern:/you/bar/baz     (ditto)
	Target file:/dest/me/foo/bar
	Target file:/dest/you/bar/baz

查看应该过滤哪个名称的最简单方法是:在使用–verbose时查看输出,并在名称前放一个/(如果你尚未准备好复制任何内容,请使用–dry-run选项)文件)。

每个目录规则及删除

没有删除选项,每个目录规则只与发送端相关,因此你可以随意排除合并文件,而不会影响传输。为了方便起见,’e’修饰符为你添加了这个排除,如以下两个等效命令所示:

# rsync -av –filter=’: .excl’ –exclude=.excl host:src/dir/dest

# rsync -av –filter=’:e .excl’ host:src/dir/dest

但是,如果你想要在接收端执行删除操作,并且希望某些文件不被删除,则需要确保接收端知道要排除哪些文件。最简单的方法是将每个目录的合并文件包含在传输中,并使用–delete-after,因为这可确保接收端在尝试删除任何内容之前获得与发送方相同的排除规则:

# rsync -avF –delete-after host:src/dir/dest

但是,如果合并文件不是传输的一部分,则需要指定一些全局排除规则(即在命令行中指定),否则你需要在接收端维护自己的每个目录合并文件。第一个例子是(假定远程.rules文件自己排除):

# rsync -av –filter=’: .rules’ –filter=’./my/extra.rules’ –delete host:src/dir/dest

在上面的示例中,extra.rules文件可以影响传输的两端,但是(在发送端),它的规则顺从于从.rules文件合并的规则的,因为extra.rules是在每个目录合并规则之后指定的。

在最后一个示例中,远程端从传输中排除.rsync过滤器文件,但我们希望使用我们自己的.rsync过滤器文件来控制在接收端删除的内容。要做到这一点,我们必须特别排除每个目录的合并文件(以免它们被删除),然后将规则放入本地文件以控制还有哪些不应该被删除。像其中一个命令一样:

# rsync -av –filter=’:e/.rsync-filter’ –delete host:src/dir/dest

# rsync -avFF –delete host:src/dir/dest

批处理模式

批处理模式可用于将相同的更新集应用于许多相同的系统。假设有目录树被复制到多个主机上。现在假设对此源代码树进行了一些更改,并且这些更改需要传播给其他主机。为了使用批处理模式执行此操作,将使用write-batch选项运行rsync,以将对源树所做的更改应用于其中一个目标树。write-batch选项会导致rsync客户端在“批处理文件”中存储对其他相同目标树重复此操作所需的所有信息。

生成批处理文件一次保存了在更新多个目标树时不止一次地执行文件状态、校验和、数据块生成。多播传输协议可用于将批量更新文件并行传输到多个主机,而不是分别向每个主机发送相同的数据。

要将记录的更改应用到其他目标树,请使用read-batch选项运行rsync,指定同一批处理文件的名称和目标树。 Rsync使用存储在批处理文件中的信息更新目标树。

为了方便起见,当使用write-batch选项时,还会创建一个脚本文件:它的命名为批处理文件名并追加“.sh”后缀。该脚本文件包含一个命令行,该命令行使用关联的批处理文件更新目标树。它可以使用shell来执行,并支持传递一个可选地替代的目标树路径名,然后使用它替代原始的目标路径。当当前主机上的目标树路径与用于创建批处理文件的目标树路径不同时,这非常有用。

如下示例:

$ rsync –write-batch=foo -a host:/source/dir/ /adest/dir/

$ scp foo* remote:

$ ssh remote ./foo.sh /bdest/dir/

$ rsync –write-batch=foo -a /source/dir/ /adest/dir/

$ ssh remote rsync –read-batch=- -a /bdest/dir/ < foo

在这些示例中,rsync用于从/source/dir/中更新/adest/dir/,重复此操作的信息存储在“foo”和“foo.sh”中。然后主机“remote”将批量数据更新到目录/bdest/dir。这两个例子之间的差异揭示了在批处理方面的一些灵活性:

  • 第一个示例显示初始副本不必是本地的。可以根据需要使用远程shell语法或rsync守护进程语法将数据推送到远程主机或从中拉出数据。
  • 第一个示例使用创建的“foo.sh”文件在远程主机上运行read-batch命令时获取正确的rsync选项。
  • 第二个示例通过stdin读取批处理数据,以便批处理文件不需要先复制到远程机器。这个例子避开了foo.sh脚本,因为它需要使用一个修改过的–read-batch选项,但是如果你想使用它,你可以编辑脚本文件(只要确保没有其他选项试图使用标准输入,例如“–exclude-from=-”选项)。

注意事项

read-batch选项期望它正在更新的目标树与用于创建批量更新文件集的目标树相同。如果遇到目标树之间的差异,则可能会放弃更新并发出警告(如果该文件已显示为最新)或者可能会尝试进行文件更新,并且如果文件无法验证,则可能会丢弃了一个错误更新。这意味着如果命令被中断,重新运行读取批量操作应该是安全的。如果您希望强制批量更新始终尝试,而不管文件的大小和日期如何,请使用-I选项(读取批次时)。如果发生错误,目标树可能会部分地出现更新的状态。在这种情况下,可以使用rsync的常规(非批处理)操作模式修复目标树。
 
所有目标上使用的rsync版本必须至少与用于生成批处理文件的rsync版本一样新。如果批处理文件中的协议版本对于批处理读取rsync来说是太新的话,那么Rsync将会因为错误而结束。另请参阅–protocol选项,让创建rsync生成旧rsync可以理解的批处理文件。 (请注意,批处理文件在版本2.6.3中更改了格式,因此混合使用较旧版本的版本将无法工作。)

读取批处理文件时,如果您没有将批处理文件读取选项设置为批处理写入命令相同,rsync将强制某些选项的值与批处理文件中的数据匹配。其他选项可以(也应该)改变。例如,除非指定了–delete选项之一,否则不需要将–read-batch、–files-from写入批处理,并且不需要–filter/–include/–exclude选项。

创建BATCH.sh文件的代码将任何过滤器/包含/排除选项转换为单个列表,该列表HEREDOC的形式附加到shell脚本文件中。高级用户可以使用它来修改排除列表,如果需要更改被–de​​lete删除的内容。普通用户可以忽略这些细节,只需使用shell脚本就可以轻松地为批处理数据运行适当的–read-batch命令。

rsync中的原始批处理模式基于“rsync+”,但最新版本使用新的实现。

符号链接

当rsync遇到源目录中的符号链接时,可能有三种基本行为:

  • 默认情况下,根本不传输符号链接。为任何存在的符号链接发出消息“skipping non-regular”文件。
  • 如果指定了–links选项,则会在目标上使用相同的目标重新创建符号链接。请注意–archive隐含了–links选项。
  • 如果指定了–copy-links选项,则通过复制它们的引用文件来“折叠”符号链接,而不是符号链接。

Rsync还可以区分“安全”和“不安全”的符号链接。可能使用此示例的示例是一个网站镜像,它希望确保复制的rsync模块不包含站点公共部分中/etc/passwd的符号链接。使用–copy-unsafe-links将导致任何链接被复制为它们指向目标的文件。使用–safe-links将导致完全省略不安全的链接。 (请注意,您必须为–safe-links指定–links才能生效。)

符号链接被认为是不安全的,如果它们是绝对符号链接(以/开头)、为空、或者它们包含足够的“..”组件,以从要复制的目录中提升访问的目录的层级。

以下是如何解释符号链接的选项的摘要。该列表按优先顺序排列,因此如果未提及您的选项组合,请使用第一行作为选项的完整子集:

–copy-links
将所有符号链接转换为普通文件(不会影响任何其他选项的符号链接)。

–links –copy-unsafe-links
将所有不安全的符号链接转换为文件,并复制所有安全符号链接。

–copy-unsafe-links
将所有不安全的符号链接转换为文件,提示跳过所有安全的符号链接。

–links –safe-links
复制的安全符号链接,并跳过不安全的符号链接。

–links
复制所有符号链接。

注意事项

时间作为*nix time_t值传输

传输到FAT文件系统时,rsync可能会重新同步未修改的文件。 请参阅–modify-window选项上的注释。

文件权限、设备等作为原始数字值传输

另请参阅–delete选项的注释

内部选项

选项–server和–sender由rsync在内部使用,在正常情况下不应由用户键入。 在某些情况下可能需要对这些选项有所了解,例如在设置只能运行rsync命令的登录时。 例如,rsync发行版的支持目录有一个名为rrsync的示例脚本(对于受限制的rsync),可以与受限制的ssh登录一起使用。

问题诊断

rsync偶尔会产生可能看起来有点神秘的错误消息。似乎导致最混乱的一个是“protocol version mismatch — is your shell clean?”。

导致此消息的原因通常是由于启动脚本或远程Shell工具在rsync用于传输的流上产生不需要的垃圾。诊断此问题的方法是运行远程shell,如下所示:

# ssh remotehost /bin/true > out.dat

然后看看out.dat。 如果一切正常,那么out.dat应该是一个零长度文件。 如果从rsync获得上述错误,那么您可能会发现out.dat包含一些文本或数据。 查看内容,并尝试找出是什么生成了这些内容。 最常见的原因是错误配置的Shell启动脚本(例如.cshrc或.profile)包含非交互式登录的输出语句。

如果您在调试过滤器模式时遇到问题,请尝试指定-vv选项。 在该详细模式下,rsync将显示为什么包含或排除每个单独的文件。

相关文件

/etc/rsyncd.conf, rsyncd.conf
Rsync守护进程的配置文件。

相关环境变量

CVSIGNORE
用于补充.cvsignore文件中的任何忽略模式。 有关更多详细信息,请参阅–cvs-exclude选项。

Rsync_ICONV
使用此环境变量指定默认–iconv设置。 (3.0.0首先支持。)

Rsync_PROTECT_ARGS
如果希望在默认情况下启用–protect-args选项,则指定非零数值。或者为零,以确保默认情况下禁用它。 (3.1.0中首先支持。)

Rsync_RSH
Rsync_RSH环境变量允许您覆盖用作rsync传输的默认Shell。 命令名后面允许使用命令行选项,就像在-e选项中一样。

Rsync_PROXY
Rsync_PROXY环境变量允许您在连接到rsync守护程序时,重定向rsync客户端以使用Web代理。 您应该将Rsync_PROXY设置为hostname:port对。

Rsync_PASSWORD
将Rsync_PASSWORD设置为所需的密码。允许您在没有用户干预的情况下运行与rsync守护程序的经过身份验证的rsync连接。 请注意,这不会为远程shell传输(如ssh)提供密码;要了解如何操作,请参阅远程shell的文档。

USER, LOGNAME
用于确定发送到rsync守护程序的默认用户名。 如果两者均未设置,则用户名默认为“nobody”。

HOME
用于查找用户的默认.cvsignore文件。

退出状态

0 成功

1 语法或用法错误

2 协议不兼容

3 选择输入/输出文件和目录发生错误

4 不支持请求的操作:尝试在不支持它们的平台上操作64位文件;或者指定了客户端而不是服务器支持的选项。

5 启动client-server协议时出错

6 守护程序无法附加到日志文件

10 套接字I/O出错

11 文件I/O出错

12 rsync协议数据流出错

13 程序诊断错误

14 IPC代码错误

20 收到SIGUSR1或SIGINT

21 由waitpid()返回一些错误

22 分配核心内存缓冲区时出错

23 由于错误导致的部分转移

24 由于源文件消失导致的部分传输

25 选项–max-delete限制停止删除

30 数据发送/接收超时

35 等待守护程序连接时超时

使用示例

要备份我的主目录,其中包含大型MS Word文件和邮件文件夹,我使用运行的cron作业:

# rsync -Cavz . arvidsjaur:backup

每晚通过PPP连接到我的机器“arvidsjaur”上,然后复制目录。

要同步我的Samba源码树,我使用以下Makefile目标:

get:
	rsync -avuzb --exclude '*~' samba:samba/ .

put:
	rsync -Cavuzb . samba:samba/

sync: 
	get put

这允许我与连接另一端的CVS目录同步。 然后我在远程计算机上执行CVS操作,这节省了大量时间,因为远程CVS协议效率不高。

我使用以下命令镜像我的“旧”和“新”ftp站点之间的目录:

# rsync -az -e ssh –delete ~ftp/pub/samba nimbus:”~ftp/pub/tridge”

上述命令每隔几个小时从Cron上运行。

你可以像使用rcp一样使用rsync。但是你必须指定一个源地址与一个目的地址,并且它们俩中只能有一个可以是远程URL。如下示例命令:

rsync -t *.c foo:src/

该命令会把当前目录下匹配*.c的所有文件传输到foo主机的src模块下。对于已经在远程主机中存在的文件,RSYNC会使用远程更新协议来更新文件,但只发送文件中的不同部分。注意,命令行中的通配符是由SHELL进行解析的,在SHELL解释完之后再运行rsync命令,而不是由rsync自己解析的,这和其他的POSIX风格的的程序的一样的。

rsync -avz foo:src/bar /data/tmp

上面的命令会递归的将来自远程主机foo上的src模块下的bar目录的所有文件拉取到本地的/data/tmp/bar目录中。文件的传输使用”归档“模式,用于确保符号链接、设备、属性、权限、所有权等可以在传输过程中能够被保留。除此之外,归档能够减少传输大小。

rsync -avz foo:src/bar/ /data/tmp

与#2中的命令相比,该命令的bar目录后多了一个斜线(/)。源地址后的斜线可以避免在目的地址中创建额外的一层目录。尾随的斜线可以理解为仅复制目录内容但是不包含目录。然而,没有尾随的斜线表示通过名字来复制目录。但这两种情况中,包含目录的属性会被传输到目的地址的包含目录。换句话说,下面两条命令的行为是相同的,包括/dest/foo目录的属性设置:

rsync -av /src/foo /dest

rsync -av /src/foo/ /dest/foo

注意host和module引用不要求使用尾随的斜线来复制默认目录的内容。比如,下面的两个示例都是拷贝远程目录的内容到/dest下:

rsync -av host: /dest

rsync -av host::module /dest

你也可以RSYNC的本地模式,源地址与目的地址都是一个本地路径,都不包含冒号(:)。在这种情况下,rsync就像一个高级的复制命令。

可以从一个特别的RSYNC服务中列出所有可列出的可用的模块。通过不指定模块名名即可:

rsync somehost.mydomain.com::

有关更多的细节可以参考前面的说明。

有关rsync的高级语法

如果要从一台远程主机中获取多个文件可以通过:(1)像第一个一样指定一个附加的远程主机参数;(2)或者忽略主机名,仅仅指定文件名。

如下命令都可以正常工作:

rsync -av host:file1 :file2 host:file{3,4} /dest/

rsync -av host::modname/file{1,2} host::modname/file3 /dest/

rsync -av host::modname/file1 ::modname/file{3,4}

在旧版本的rsync要求在源地址中使用引号,如下示例:

rsync -av host:’dir1/file1 dir2/file2′ /dest

rsync host::’modname/dir1/file1 modname/dir2/file2′ /dest

最新版本的rsync中依旧可以使用”词分割“(第二种方法),但不如第一种方法用起来容易。如果你要发送的文件名中包含了空格,你可以指定–protect-args(-s)选项,或者以远程SHELL可理解的格式来转义空白字符。如下示例:

rsync -av host:’file\ name\ with\ spaces’ /dest

对空格进行了转义。

相关手册

rsyncd.conf(5)

参考文献

man 1 rsync, Version 3.1.2-2.1
访问Rsync项目主页
Wikipedia中关于Rsync的介绍
Why rsync attempts to copy file that is already up-to-date? – Unix & Linux Stack Exchange
Rsync (No need to copy the time stamp) – Unix & Linux Stack Exchange
bash – Speed up rsync with Simultaneous/Concurrent File Transfers?