每天一个 Linux 命令(22)—— rsync

380 阅读14分钟

这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战

命令简介

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

通常,sync 采用“快速检测”算法,根据文件的大小与最近访问时间是否变化及指定的选项,确定文件是否需要复制、完整复制还是复制剩余部分、文件的其他属性变化是否需要维持等。根据源文件与目的文件的差异,rsync 命令通常采用 增量传输 的算法,减少网络传输的流量。目前,rsync 广泛用于文件的备份与镜像,作为改善与增强的复制命令,成为每天必用的文件复制工具。

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

rsync 采用两种不同的方式与远程系统通信:

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

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

在指定源文件参数时,源路径名中的目录后面是否存在斜线字符,其意义是不同的。目录后面没有斜线字符表示复制目录本身及其中的文件,故需要在目的系统中创建一级或多级目录,把其中的文件复制到目的系统新建的目录中。如果存在斜线字符,表示仅把目录中的文件(不包括目录本身)复制到目的系统。但在任何情况下,都需要维持源目录的属性。

例如,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 目录中。

语法格式

rsync 常用语法格式有如下几种:

rsync [OPTION]... SRC DEST
rsync [OPTION]... SRC [USER@]host:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... [USER@]HOST::SRC DEST
rsync [OPTION]... SRC [USER@]HOST::DEST
  1. 拷贝本地文件。当 SRC 和 DES 路径信息都不包含有单个冒号 : 分隔符时就启动这种工作模式。如:rsync -a /data /backup
  2. 使用一个远程 shell 程序(如 rsh、ssh)来实现 将本地机器的内容拷贝到远程机器。当 DST 路径地址包含单个冒号 : 分隔符时启动该模式。如:rsync -avz *.c foo:src
  3. 使用一个远程 shell 程序(如 rsh、ssh)来实现 将远程机器的内容拷贝到本地机器。当 SRC 地址路径包含单个冒号 : 分隔符时启动该模式。如:rsync -avz foo:src/bar /data
  4. 从远程 rsync 服务器中拷贝文件到本地机。当 SRC 路径信息包含 :: 分隔符时启动该模式。如:rsync -av root@192.168.78.192::www /databack
  5. 从本地机器拷贝文件到远程 rsync 服务器中。当 DST 路径信息包含 :: 分隔符时启动该模式。如:rsync -av /databack root@192.168.78.192::www

命令参数

参数解释
-a,--archive创建档案文件模式。相当于同时指定了 -rlptgoD 多个选项。
-A,--acls保持文件原有的 ACL(蕴含着指定了 -p 选项)。
-b,--backup在传输或删除文件之前,采用重新命名的方式,备份现有的目的文件。
-B blksize,--block-size=blksize强制 rsync 使用固定大小的数据块计算或传输文件。通常是基于每个需要更新的文件的大小确定的。
-c,--checksum采用校验和替代默认的“快速检测”算法检查文件是否变动及文件是否需要传输。
-d,--dirs告诉发送方传输其遇到的任何目录。
-D等同于 --devices 与 --specials选项。
-e cmd,--rsh=cmd选用指定的命令 cmd 作为远程 Shell,以便本地与远程 rsync 之间通信用之。通常,rsync 使用 ssh 进行通信。
-E,--executability保持文件原有的可执行权限不变。
-f rule,--filter=rule增加指定的过滤规则,从选定的传输文件中排除一定的文件。
-g,--group保持文件原有的用户组属性。
-h,--human-readable以容易阅读和理解的形式输出数值。
-H,--hard-links传输文件时检查发送方是否存在硬链接的文件,当需要传输的文件为硬链接文件时,把硬链接的文件连接到接受方的相应文件中,保持文件的硬链接状态在源和目的系统中相同。如果未指定这个选项,将会按照单独的文件传输与存储硬链接的文件。
-i,--itemize-changes逐一显示每个文件的变化,包括属性变化。
-I,--ignore-times通常,rsync 会忽略具有相同大小和修改时间的任何文件。这个选项表示不管文件的大小和修改时间是否相同,所有的文件都需要更新。
-k,--copy-dirlinks令发送方把指向目录的符号链接文件作为实际目录处理。
-K,--keep-dirlinks令接收方把指向目录的符号链接文件作为实际目录处理(仅当匹配发送方的实际目录时)。如果未指定这个选项,删除接收方的符号链接文件,而代之以实际的目录。
-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递归地逐层遍历目录。
-R,--relative使用相对路径。
-t,--times保持文件的修改时间不变。表示在传输文件数据的同时,也要传输文件的修改时间。
-T dir,--temp-dir=dir在指定的目录中创建临时文件。
-u,--update当目的系统中文件的修改时间比源文件的修改时间还新时,禁止传输与复制文件(如果源与目的文件的修改时间相同,但文件大小不同,仍需要更新文件)。
-v,--verbose增加文件传输期间输出的信息量。
-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 表示文件。
--compress-level=num明确设置传输文件时采用的压缩级别。
--copy-unsafe-links复制指向欲复制的目录层次结构之外的任何符号链接文件。
--delay-updates针对需要更新的每个文件,在单独的目录中创建临时文件,直至传输结束,再统一把临时文件重新命名为目的目录中的文件,以替代原来的文件。
--delete从目的目录中删除接收方存在但发送方已不存在的无关紧要的文件。
--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使用指定的格式和传输的文件更新日志文件。
--max-delete=num禁止删除超过指定数量的文件或目录。如果删除的文件超过此限,rsync 将会输出警告信息,然后终止执行。
--max-size=size避免传输大于指定容量的文件。
--min-size=size禁止传输小于指定容量的文件。size 的意义与用法同上。
--modify-window=num使用指定的误差比较文件的修改时间。
--no-option通过在选项名字前面加 no- 前缀,可以关闭一个或多个蕴含的选项。
--no-implied-dirs用于调整 --relative 选项的默认处理方式。
--numeric-ids禁止把用户 ID 和用户组 ID 映射到相应的用户名和用户组名。
--out-format=fmt使用指定的格式显示传输的文件。
--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 的不是超级用户,接收方仍然尝试采用超级用户的处理方式。
--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
  1. 采用下拉方式,把远程系统 foo 上 /src/c 目录中的文件传输到本地主机的 /home/gqxing/src 目录。确保符号链接文件、文件的访问权限与属主等文件属性在传输后得以维持。
rsync -av foo:/src/c /home/gqxing/src
  1. 采用推送方式,把本地主机 /data/ 目录中的文件递归地传输到远程系统 foo 的 /backup 目录中。同时采用压缩的方式,减少传输的数据量,提高文件传输的速度。
rsync -avz /data/ foo:backup

参考文档

  • 《Linux 常用命令简明手册》—— 邢国庆编著