本文是man rsync的官方手册译文,版本是3.1.2。
本文没打算翻译每个option,常用的option已经在另一篇文章rsync基础中有描述。
一开始的翻译过程比较顺畅,越到后面越难以理解,侧面也反应出了英文能力受限。
大家想查看完整的rsync man手册,可参考骏马金龙大佬的翻译。
NAME
rsync是一款快速的,全能的,远程(和本地)文件复制工具。
SYNOPSIS
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,则表示列出源文件,而不是复制。
DESCRIPTION
rsync是一款快速的,非常全能的文件复制工具。它可以实现本地复制,通过任何的远程shell(译者注:一般是指SSH。RSH由于不安全,已不使用。)复制(文件)到/来自其他主机,或者复制到/来自一个远程的rsync daemon。它提供了大量的选项来控制rsync的行为以及允许拷贝非常灵活的文件集规格。最著名的当属它的增量传输算法了,该算法可以只传输源文件和目标文件中的差异部分从而大大降低了网络中传输的数据。rsync广泛地应用于备份、镜像以及增强复制的场景中。
rsync默认情况下使用快速检测(quick check)算法来判断文件是否应该被传输,该算法判断的依据是文件的大小或者文件的上次修改时间是否发生改变。当快速检测算法表明文件的数据没必要被更新的时候,在其他保留属性(如选项所请求的)中的任何修改会被直接作用在目标文件上。
rsync的其他特性:
- 支持复制链接,设备,属主,属组,和权限。
- 类似GNU tar的exclude和exclude-from选项。
- 支持CVS排除模式,即排除svn或者Git这类版本控制系统的特殊文件。
- 可以使用任何透明的远程shell,包括ssh和rsh。
- 不需要超管权限(root)。
- 文件传输的管道化(pipelining)用于最小化潜在开销。
- 支持匿名用户或者认证的rsync daemon(对镜像来说是理想的)。
GENERAL
rsync复制文件,要么从本地到远程,要么从远程到本地,或者本地主机内部复制(它不支持在两台远程主机之间复制数据)。
rsync连接远程系统的方式有两种:使用远程shell作为传输通道或者通过TCP/IP协议直接连接一个rsync daemon。当源或者目标路径中的HOST后面跟着一个分号的时候则启用了远程shell传输通道。rsync daemon则是使用两个分号或者使用rsync://这种URL格式。还有一种方式,具体参见USING RSYNC-DAEMON FEATURES VIA A REMOTE-SHELL CONNECTION部分。
作为一种特殊的情况,如果参数中只有一个源,并且没有目标,那么则会以类似“ls -l”的输出结果列出文件列表。
如果源和目标都没有指定一个远程主机,则表示发生了本地复制。(另请参阅--list-only选项)
rsync将本地端(local side)认为是“客户端”(client),将远程端(remote side)认为是“服务器端”(server)。因此,不要将服务器端认为就是rsync daemon —— rsync daemon它总会是一个服务器端,但是一个服务器端可以是一个daemon或者是一个远程shell spawn出来的进程。
SETUP
阅读README文件查询安装指南。
一旦安装完毕,你可以使用rsync到达任何你可以通过远程shell或者rsync daemon访问到的机器。对于远程传输,现在的rsync使用ssh协议,但是默认情况下它也可以被配置成不同的远程shell,例如rsh或者remsh。
你也可以指定任何你想要的远程shell,通过-e命令行选项或者RSYNC_RSH环境变量。
注意,rsync必须在源和目标主机两端都要安装!
USAGE
rsync的用法类似rcp命令。你必须指定一个源和目标,其中一个可能是远程端。
也许最好的解释语法的方式就是使用一些示例:
rsync -t *.c foo:src/
这将会传输所有匹配“*.c”模式的文件到foo机器上的src目录。如果任何文件在远程系统上已经存在的话,那么rsync的remote-update协议将会通过只发送数据的不同部分来更新文件。请注意,命令行中“*.c”通配符的展开是由shell完成的,而不是由rsync自身(更准确地说,和所有其他POSIX类型的程序一样)。
rsync -avz foo:src/bar /data/tmp
这将会递归拷贝foo主机上的“src/bar”目录至本地的“/data/tmp/bar”目录中。文件以“归档”模式传输,这确保了在传输过程中保留了字符链接、设备文件、属性(attribute)、权限、所有权等。另外,还通过使用压缩技术减少了传输中的数据部分的大小。
译者注:这里的属性指的是lsattr和chattr命令所涉及的那类信息。
rsync -avz foo:src/bar/ /data/tmp
源中末尾的斜线改变了行为,它避免在目标上创建额外的目录层级。你可以将源中末尾的斜线理解为“复制这个目录的内容”,与“通过名称复制目录”截然相反,但是这两种情况都会将包含的目录的属性传输到目标上包含的目录中。换句话说,下面的每个命令复制文件的方式是一样的,包括“/dest/foo”属性的设置:
rsync -av /src/foo /dest
rsync -av /src/foo/ /dest/foo
另请注意,主机和模块的引用不要求一个末尾的斜线用于拷贝默认目录的内容。例如,下面两种都会复制远程目录的内容至“/dest”:
rsync -av host: /dest
rsync -av host::module /dest
你也可以使用rsync的本地复制模式,这种情况下源和目标都不需要带上分号“:”。这种情况下,它的行为类似增强型的复制命令。
最终,你可以通过留空(leave off)模块名来列出某个daemon中所有的可用模块(如果可列出的话)。
rsync somehost.mydomain.com::
查看以下部分了解更详细的信息。
ADVANCED USAGE
通过指定额外的远程主机参数的语法可以从一个远程主机中请求多个文件,额外的远程主机参数和第一个(远程主机参数)使用相同的风格或者省略掉主机名。如下所示:
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需要将SRC中的空格使用引号包裹,像这样:
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
CONNECTING TO AN RSYNC DAEMON
也可以不以远程shell作为rsync的传输通道。在这种情况下,你将会直接连接到一个远程rsync daemon,一般是使用TCP的873号端口。(这要求在远程系统上需要事先运行一个rsync daemon,详见STARTING AN RSYNC DAEMON TO ACCEPT CONNECTIONS。)
使用rsync daemon与使用远程shell的区别:
- 在分隔主机名和路径的时候,你应该使用两个引号而不是一个引号,或者使用“rsync://”。
- “路径”中的第一个单词是模块名称。
- 当你连接上一个daemon的时候,它可能会打印一些每日消息。
- 如果你在连接daemon的时候没有指明路径名称,那么就会列出一些可访问的路径。
- 如果你没有指明一个本地目标的话,那么会提供daemon中特定文件的列表。
- 你不可以指定--rsh (-e)选项。
示例,从一个叫“src”的远程模块中拷贝所有的文件。
rsync -av host::src /dest
一些模块可能要求身份验证(authentication)。如果要的话,你连接上之后会提示你输入密码。你可以设置RSYNC_PASSWORD环境变量或者使用--password-file命令行选项来避免密码提示。这种方式一般用于脚本中使用。
警告:部分系统中,环境变量对于所有用户来说是可读的。因此在那类系统上,建议使用--password-file命令行选项。
你可以设置RSYNC_PROXY环境变量(值为hostname:port)来通过web代理连接daemon。注意,你的web代理的配置必须支持连接到873端口。
你也可以设置RSYNC_CONNECT_PROG环境变量来指定某个应用程序作为代理而不是直接使用套接字连接。字符串可能包含“%H”转义来表示命令行中的主机名(如果在字符串中要表示“%”的话,则使用“%%”)。例如:
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端口上。
USING RSYNC-DAEMON FEATURES VIA A REMOTE-SHELL CONNECTION
有时候,不允许新的套接字连接(不同于远程shell)而使用daemon的各种特性(例如命名的模块)是很有用的。rsync支持通过远程shell连接到一台主机然后spawn出一个一次性的(single-use)“daemon”,这种daemon期望从远程用户的家目录中读取配置文件。如果你想加密一个daemon风格的传输数据的话,那么这是有用的,但是daemon是通过远程用户刚刚(fresh)启动的,你可能无法使用诸如chroot或者改变uid的特性。(另一种加密daemon传输的方式是,考虑使用ssh从本地端口到远程主机建立一个隧道(tunnel),然后在远程主机上配置一个正常的rsync daemon,但是仅开放给“localhost”连接。)
从用户的角度来看,通过远程shell使用rsync daemon和正常使用rsync daemon在语法上是相似的,区别在于你必须明确在命令行中使用--rsh=COMMAND选项。(设置RSYNC_RSH环境变量不会启用该功能。)例如:
rsync -av --rsh=ssh host::module /dest
可以通过ssh的-l选项来修改远程shell所使用的用户,示例中的“rsync-user@host”中的rsync-user是rsync模块认证的用户,不要搞混了。-e选项是--rsh选项的缩写。
rsync -av -e "ssh -l ssh-user" rsync-user@host::module /dest
ssh-user用户登录ssh,rsync-user用于登录rsync模块。
STARTING AN RSYNC DAEMON TO ACCEPT CONNECTIONS
为了连接到一个rsync daemon,远程系统需要事先运行一个daemon(或者被配置成使用inetd托管来按需spawn出进程)。查询rsyncd.conf(5)的man手册了解如何启动一个daemon,它是rsync daemon的配置文件,涉及了独立运行(stand-alone)模式和inetd模式。
如果你使用远程shell作为传输通道的话,就没必要启用一个rsync daemon了。
SORTED TRANSFER ORDER
rsync总是会将指定的文件名排序后再放入传输列表。这个操作合并了重名的目录,使得删除重复文件名更加简单,不过这可能会让某些用户觉得困惑,因为文件传输的顺序和他们在命令行给的顺序是不同的。
如果你希望某个特定的文件优先被传输,要么分开文件调用rsync命令,要么考虑使用--delay-updates选项(它不会影响已排序好的传输顺序,但会使得最终的文件更新阶段发生得更快)。
EXAMPLES
这里是一些示例关于我如何使用rsync。
要备份我老婆的家目录,里面包含了大量的微软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协议不是很有效的时候,这节省了我大量的时间。
我使用此命令镜像了我的“old”和“new”FTP站点:
rsync -az -e ssh --delete ~ftp/pub/samba nimbus:"~ftp/pub/tridge"
在cron中每几个小时就会运行一次。
OPTIONS SUMMARY
这些是rsync选项的简要描述,详细的完整的描述信息,请参考下面的OPTIONS部分。
-v, --verbose increase verbosity --info=FLAGS fine-grained informational verbosity --debug=FLAGS fine-grained debug verbosity --msgs2stderr special output handling for debugging -q, --quiet suppress non-error messages --no-motd suppress daemon-mode MOTD (see caveat) -c, --checksum skip based on checksum, not mod-time & size -a, --archive archive mode; equals -rlptgoD (no -H,-A,-X) --no-OPTION turn off an implied OPTION (e.g. --no-D) -r, --recursive recurse into directories -R, --relative use relative path names --no-implied-dirs don't send implied dirs with --relative -b, --backup make backups (see --suffix & --backup-dir) --backup-dir=DIR make backups into hierarchy based in DIR --suffix=SUFFIX backup suffix (default ~ w/o --backup-dir) -u, --update skip files that are newer on the receiver --inplace update destination files in-place --append append data onto shorter files --append-verify --append w/old data in file checksum -d, --dirs transfer directories without recursing -l, --links copy symlinks as symlinks -L, --copy-links transform symlink into referent file/dir --copy-unsafe-links only "unsafe" symlinks are transformed --safe-links ignore symlinks that point outside the tree --munge-links munge symlinks to make them safer -k, --copy-dirlinks transform symlink to dir into referent dir -K, --keep-dirlinks treat symlinked dir on receiver as dir -H, --hard-links preserve hard links -p, --perms preserve permissions -E, --executability preserve executability --chmod=CHMOD affect file and/or directory permissions -A, --acls preserve ACLs (implies -p) -X, --xattrs preserve extended attributes -o, --owner preserve owner (super-user only) -g, --group preserve group --devices preserve device files (super-user only) --copy-devices copy device contents as regular file --specials preserve special files -D same as --devices --specials -t, --times preserve modification times -O, --omit-dir-times omit directories from --times -J, --omit-link-times omit symlinks from --times --super receiver attempts super-user activities --fake-super store/recover privileged attrs using xattrs -S, --sparse handle sparse files efficiently --preallocate allocate dest files before writing -n, --dry-run perform a trial run with no changes made -W, --whole-file copy files whole (w/o delta-xfer algorithm) -x, --one-file-system don't cross filesystem boundaries -B, --block-size=SIZE force a fixed checksum block-size -e, --rsh=COMMAND specify the remote shell to use --rsync-path=PROGRAM specify the rsync to run on remote machine --existing skip creating new files on receiver --ignore-existing skip updating files that exist on receiver --remove-source-files sender removes synchronized files (non-dir) --del an alias for --delete-during --delete delete extraneous files from dest dirs --delete-before receiver deletes before xfer, not during --delete-during receiver deletes during the transfer --delete-delay find deletions during, delete after --delete-after receiver deletes after transfer, not during --delete-excluded also delete excluded files from dest dirs --ignore-missing-args ignore missing source args without error --delete-missing-args delete missing source args from destination --ignore-errors delete even if there are I/O errors --force force deletion of dirs even if not empty --max-delete=NUM don't delete more than NUM files --max-size=SIZE don't transfer any file larger than SIZE --min-size=SIZE don't transfer any file smaller than SIZE --partial keep partially transferred files --partial-dir=DIR put a partially transferred file into DIR --delay-updates put all updated files into place at end -m, --prune-empty-dirs prune empty directory chains from file-list --numeric-ids don't map uid/gid values by user/group name --usermap=STRING custom username mapping --groupmap=STRING custom groupname mapping --chown=USER:GROUP simple username/groupname mapping --timeout=SECONDS set I/O timeout in seconds --contimeout=SECONDS set daemon connection timeout in seconds -I, --ignore-times don't skip files that match size and time --size-only skip files that match in size --modify-window=NUM compare mod-times with reduced accuracy -T, --temp-dir=DIR create temporary files in directory DIR -y, --fuzzy find similar file for basis if no dest file --compare-dest=DIR also compare received files relative to DIR --copy-dest=DIR ... and include copies of unchanged files --link-dest=DIR hardlink to files in DIR when unchanged -z, --compress compress file data during the transfer --compress-level=NUM explicitly set compression level --skip-compress=LIST skip compressing files with suffix in LIST -C, --cvs-exclude auto-ignore files in the same way CVS does -f, --filter=RULE add a file-filtering RULE -F same as --filter='dir-merge /.rsync-filter' repeated: --filter='- .rsync-filter' --exclude=PATTERN exclude files matching PATTERN --exclude-from=FILE read exclude patterns from FILE --include=PATTERN don't exclude files matching PATTERN --include-from=FILE read include patterns from FILE --files-from=FILE read list of source-file names from FILE -0, --from0 all *from/filter files are delimited by 0s -s, --protect-args no space-splitting; wildcard chars only --address=ADDRESS bind address for outgoing socket to daemon --port=PORT specify double-colon alternate port number --sockopts=OPTIONS specify custom TCP options --blocking-io use blocking I/O for the remote shell --outbuf=N|L|B set out buffering to None, Line, or Block --stats give some file-transfer stats -8, --8-bit-output leave high-bit chars unescaped in output -h, --human-readable output numbers in a human-readable format --progress show progress during transfer -P same as --partial --progress -i, --itemize-changes output a change-summary for all updates -M, --remote-option=OPTION send OPTION to the remote side only --out-format=FORMAT output updates using the specified FORMAT --log-file=FILE log what we're doing to the specified FILE --log-file-format=FMT log updates using the specified FMT --password-file=FILE read daemon-access password from FILE --list-only list the files instead of copying them --bwlimit=RATE limit socket I/O bandwidth --write-batch=FILE write a batched update to FILE --only-write-batch=FILE like --write-batch but w/o updating dest --read-batch=FILE read a batched update from FILE --protocol=NUM force an older protocol version to be used --iconv=CONVERT_SPEC request charset conversion of filenames --checksum-seed=NUM set block/file checksum seed (advanced) -4, --ipv4 prefer IPv4 -6, --ipv6 prefer IPv6 --version print version number (-h) --help show this help (see below for -h comment)
rsync也可以以daemon方式运行,以下是daemon形式所支持的选项:
--daemon run as an rsync daemon --address=ADDRESS bind to the specified address --bwlimit=RATE limit socket I/O bandwidth --config=FILE specify alternate rsyncd.conf file -M, --dparam=OVERRIDE override global daemon config parameter --no-detach do not detach from the parent --port=PORT listen on alternate port number --log-file=FILE override the "log file" setting --log-file-format=FMT override the "log format" setting --sockopts=OPTIONS specify custom TCP options -v, --verbose increase verbosity -4, --ipv4 prefer IPv4 -6, --ipv6 prefer IPv6 -h, --help show this help (if used after --daemon)
OPTIONS
长选项(双破折号+单词)和短选项(单破折号+单词),rsync均支持。可用选项的完整列表描述如下。如果一个选项可以以多种方式指定的话,要选择逗号分隔。某些选项只有长选项。如果选项带了参数,那么参数只会在长选项后面列出,虽然它也可以被短选项列出。当指定一个选项参数的时候,你可以使用“--option=param”的格式,或者将等于号替换为空格。某些情况下选项参数可能需要使用引号包裹以避免被shell命令行所解释。记住,文件名中起始的波浪号会被shell所替换,所以“--option=~/foo”不会将波浪号修改成你的家目录(要把等于号换成空格)。
。。。
DAEMON OPTIONS
以下选项是专供daemon形式所使用:
。。。
FILTER RULES
过滤器规则(FILTER RULES)允许用户灵活定义哪些文件被传输(include)和哪些文件被跳过(exclude)。规则可以通过--include/--exclude选项直接指明模式(PATTERN),或者通过--exclude-from/--include-from从一个文件中指明多个模式。
当待传输的文件/目录列表创建完毕之后,rsync会将其中的每个文件名轮流与include/exclude模式进行检查匹配,第一个匹配到的就会起作用:如果是exclude模式,则该文件会被跳过;如果是include模式,则该文件名(filename)不会被跳过;如果没有与之匹配的模式,则文件名也不会被跳过。
rsync根据命令行中指定的过滤器规则创建一个有序的列表。过滤器规则语法如下:
RULE [PATTERN_OR_FILENAME]
RULE,MODIFIERS [PATTERN_OR_FILENAME]
RULE的名称有如下所示两种形式,一种长名称一种短名称,用户可自行选择。如果使用短名称,那么RULE和MODIFIERS中间的逗号“,”就是可选的。后面紧随的PATTERN_OR_FILENAME必须跟在一个空格或者一个下划线之后。可用的规则前缀如下:
- exclude, -:指定一个排除模式。
- include, +:指定一个包含模式。
- merge, .:指定一个合并文件(merge-file)用于读取更多的规则。
- dir-merge, ::指定一个每目录(per-directory)合并文件(merge-file)。
- hide, H:指定一个模式用于在传输的时候隐藏文件。
- show, S:匹配该模式的文件不会被隐藏。
- protect, P:指定一个模式用于在删除的时候保护文件。
- risk, R:匹配该模式的文件不会被保护。
- clear, !:清除当前的include/exclude列表(不带参数)。
如果规则是从文件中读取的话,则文件中的空行会被忽略,以“#”起始的行是注释。
注意:--include/--exclude命令行选项不允许上述所有的规则解释,它们只允许解释include/exclude规则,以及加上一个感叹号“!”标记来清空规则列表(以及当规则是从文件中读取的时候的正常的注释解释)。在使用--include/--exclude选项并书写PATTERN的时候,无需显示加上“+ ”或者“- ”,--include/--exclude选项会自动帮用户完成该步骤。换句话说,使用--filter选项书写规则,则必须在每个规则的开始都写明规则的名称(长或短均可)。
注意:--filter、--include和--exclude每个选项都只能带上一个规则/模式。要添加多个的话,可以在命令行中重复使用选项、或者使用--filter选项的merge-file语法、或者使用--include-from/--exclude-from选项。
INCLUDE/EXCLUDE PATTERN RULES
你可以在指定模式的时候使用“+”或者“-”来包含或者排除文件。include/exclude规则中所指定的模式会和文件列表中待传输的文件逐一匹配。模式有以下几种形式:
- 如果模式以“/”开头的话,那么它会锚定(anchor)到某个文件层级结构的特定的点,否则它就会匹配路径名的末尾。这就类似正则中的“^”匹配行首的用法一样。因此“/foo”可以匹配到“传输的根(root of the transfer)”(对于一个全局规则来说)下的或者合并文件目录(对于一个每目录规则来说)下的“foo”名称。一个未经限制的“foo”可以匹配树中任何位置的“foo”名称,因为算法的应用是自上而下递归的;它的表现就像是每个路径组件(component)都轮流作为文件名的最后一部分。甚至是一个未锚定的“sub/foo”将会匹配层级结构中任何一个在“sub”目录中名为“foo”的名称。详见ANCHORING INCLUDE/EXCLUDE PATTERNS了解如何指定一个匹配传输的根的模式。
- 如果模式以一个“/”结尾的话,那么它将只会匹配到一个目录,而不是普通文件、字符链接或者设备文件。
- rsync根据模式中是否包含“*”、“?”和“[”字符来决定是使用简单字符串匹配还是通配符匹配。
- 一个“*”表示匹配任何路径组件,但会在遇到斜线“/”的时候停止。
- 两个“*”表示匹配任何内容,包括斜线“/”。
- 一个“?”表示匹配任何字符除了斜线“/”。
- 一个“[”引入了一个字符类,例如[a-z]或者[[:alpha:]]。
- 在一个通配符模式中,一个反斜线“”可用于转义一个通配符字符,如果不是通配符字符的话则匹配原本字面含义(例如“zhang”匹配到的是“zhang”,因为hag都不是通配符字符)。这意味着当一个模式包含通配符字符与一个模式不包含通配符字符相比的时候,会存在一个反斜线移除的额外级别。例如,如果你添加一个通配符至“fooar”(这个模式包含了反斜线)中,那么就应该使用“foo\bar*”来避免“”被理解为仅仅只有“b”,即这样“\”才可以匹配到反斜线。
- 如果模式包含一个非末尾的“/”或者一个“**”,那么它会匹配完整的路径名,包含任何起始目录。如果模式没有包含一个“/”或者一个“**”,那么它只会和文件名的最后一部分匹配。(要记得,算法的应用是递归的,所以“完整的文件名”实际上可能是从起始目录向下的任何一部分。)
- 一个末尾的“dir_name/***”将会匹配目录本身(就好像指定了“dir_name/”)以及目录下的任何文件(就好像指定了“dir_name/**”)。这种行为是在2.6.7版本添加进来的。
注意,当使用了递归选项(-r或者-a)的时候,每个路径的每个子组件会被自顶向下地被访问,因此include/exclude模式会递归地应用到每个子组件的完整名称(例如要包含“/foo/bar/baz”的话,就不可以排除“/foo”和“/foo/bar”)。当找到要发送的文件的时候,排除模式实际上短路了(short-circuit,作动词,短路,这里有跳过之意)目录的遍历阶段。如果一个模式排除了一个特定的父目录,它会导致更深层次的包含目录无效,因为rsync不会下降(descend)到那些被排除的层级结构中。当使用末尾“*”规则的时候,这很重要。例如,这样子是不会正常工作的:
+ /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 - *
这有一些include/exclude模式的示例:
- “- *.o”:排除所有匹配“*.o”的名称。
- “- /foo”:排除传输根(transfer-root)目录下的名为foo的文件或者目录。
- “- foo/”:排除所有名为foo的目录。
- “- /foo/*/bar”:排除传输根目录下的foo目录下的下两层目录下的名为bar的文件。
- “- /foo/**/bar”:排除传输根目录下的foo目录下的至少下两层目录下的名为bar的文件。
- “+ */”、“+ *.c”和“- *”的结合将会包含所有的目录和C源代码文件,所有其他的文件被排除。
- “+ foo/”、“+ foo/bar.c”和“- *”的结合将只会包含foo目录和foo/bar.c文件。(foo目录必须被包含,否则foo/bar.c文件也会被排除掉)
以下修饰符可以被“+”或者“-”接受:
- /:表示include/exclude规则应该根据当前item的绝对路径来匹配。例如,“-/ /etc/passwd”在每次从“/etc”目录传输文件出去的时候,总是会排除passwd文件;“-/ subdir/foo”将总会排除目录“subdir”下的“foo”,即便“foo”是当前传输的根目录。
- !:表示当模式不匹配的时候才生效,即取反之意。例如,“-! */”表示排除所有的非目录类型的文件。
- C:表示所有的CVS类型的文件都会被排除,该修饰符不可带参数,用法是“-C”。
- s:表示规则会应用至发送端(sending)。当一条规则影响了发送端,可用于阻止文件被传输。默认情况下,除非指定了--delete-excluded选项否则一条规则会对两端都产生影响,在这种情况下,规则只会影响发送端。另请参阅hide(H)和show(S)规则,它们是另一种方式用于影响发送端的include/exclude。
- r:表示规则会应用至接收端(receiving)。当一条规则影响了接收端,可用于阻止文件被删除。查看s修饰符了解更多信息。另请参阅protect(P)和risk(R)规则,它们是另一种方式用于影响接收端的include/exclude。
- p:表示规则是易腐的(perishable),意味着在被删除的目录中它会被忽略。例如,-C选项的默认规则(排除诸如“CVS”和“*.o”的文件)会被标记为易腐的,并且不会阻止一个在源主机上被移除的目录在目标主机上被删除。
MERGE-FILE FILTER RULES
你可以通过指定一个合并规则(.)或者一个目录合并规则(:)来将整个文件合并到过滤器规则中。(FILTER RULES中有描述过)
有两种合并文件的方式——单实例(.)和每目录(:)。单实例合并文件是只读取一次,然后它的规则被包含到过滤器列表替换掉“.”规则的位置。对于每目录合并文件来说,rsync会扫描它所遍历的每个目录寻找那个被指名的文件,如果找到的话,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
以下修饰符可用于合并或者目录合并规则:
- -:规定文件只能由排除(exclude)模式组成,其他的规则不会被解释除了文件内注释。
- +:规定文件只能由包含(include)模式组成,其他的规则不会被解释除了文件内注释。
- 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规则集合会被一起分组在合并文件被指定的点(spot),因此在全局规则列表中较早指定的规则有可能覆盖dir-merge规则。当从一个每目录文件中读取到一个列表清除规则(“!”)的时候,它只会针对当前的合并文件清除掉继承的规则。
另一种阻止每目录合并文件中的规则被继承的方式是通过一个起始的斜线将其锚定。在每目录合并文件中被锚定的规则是相对于合并文件的目录,因此一个模式“/foo”仅仅只会匹配每目录合并文件所在目录下的“foo”文件。
这里有一个你通过--filter=". file"指定的过滤器文件的示例:
merge /home/user/.global-filter - *.gz dir-merge .rules + *.[ch] - *.o
这会在列表的一开始合并/home/user/.global-filter文件的内容并且会将“.rules”放入每目录过滤器文件。所有规则的读取,在目录扫描开始之前,跟随全局锚定规则(即一个起始的斜线匹配传输根)。
如果一个每目录合并文件通过一个路径指定了,并且这路径是第一次传输目录的父目录。
暂告一段落!!!
LIST-CLEARING FILTER RULE
ANCHORING INCLUDE/EXCLUDE PATTERNS
正如之前(在INCLUDE/EXCLUDE PATTERN RULES的第一段)所提到的,全局的include/exclude模式会在“传输的根”中被锚定(与每目录模式不同,它(指代每目录模式)会在合并文件的目录锚定。)。如果你将传输思考成一棵被从发送端发往接收端的名称的子树的话,那么传输根就是目标目录中树开始被复制的地方。这个根控制了以“/”开始的模式所匹配的位置。
由于匹配是相对于传输根的,修改源路径的末尾斜线或者修改--relative选项的使用影响了你在匹配的时候需要使用的路径(另外,还修改了被复制的文件树的多少)。以下示例证明了这点。
假设我们要匹配两个源文件,一个带了绝对路径“/home/me/foo/bar”,另一个的路径是“/home/you/bar/baz”。这是不同的命令选择如何影响双源传输的:
Example cmd: 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 Example cmd: 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 Example cmd: 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 Example cmd: 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选项)。
PER-DIRECTORY RULES AND DELETE
。。。
BATCH MODE
。。。
SYMBOLIC LINKS
。。。
DIAGNOSTICS
。。。
EXIT VALUES
。。。
ENVIRONMENT VARIABLES
。。。
FILES
。。。
SEE ALSO
。。。
BUGS
。。。
VERSION
3.1.2
INTERNAL OPTIONS
。。。
CREDITS
。。。
THANKS
。。。
AUTHOR
。。。