Linux 中的 Rsync 示例 - 增量文件传输和数据同步
rsync 代表“远程同步”,是一个功能强大的命令行实用程序,用于同步本地系统或远程计算机上的目录。默认情况下,它内置于几乎所有 Linux 系统中,本教程将通过为您提供管理员用来在多个服务器/主机之间保持数据同步的最常见 rsync 示例来帮助您更好地理解 rsync。
一些用户错误地将 rsync 视为文件复制工具,例如 cp
或 scp
。虽然存在一些重叠,但 rsync 在同步方面表现出色。换句话说,它可以采用源目录并创建相同的目标目录。当源目录中的文件发生更改时,rsync 可以有效地将内容同步到目标目录,仅传输已更改的位。它也是一个非常安全的实用程序,利用 SSH 进行远程文件传输。
这使得 rsync 作为文件复制之外的备份工具非常有效。许多备份实用程序以某种形式使用 rsync,因为有些用户不愿意学习如何使用 rsync 命令。实际上,它可能非常复杂,但只有当您需要执行特定操作时,rsync 才会变得复杂。如果您从基础知识开始了解 rsync,就很容易理解。
在本指南中,我们将通过示例学习如何使用 rsync 命令。如果您有两个想要保持同步的目录,请在您自己的系统上进行操作,并学习掌握 rsync 命令。
在本教程中您将学习:
rsync 命令行示例
rsync 命令示例
通过示例来了解 rsync 是最简单的。首先,在您自己的系统上使用以下一些命令,您将很快掌握它。
基本 rsync 示例
有很多与 rsync 一起使用的选项非常常见。这包括递归传输、文件修改时间的传输、文件权限、符号链接等。所有这些选项组合起来最终是
-rlptgoD
。然而,rsync 已将所有这些选项组合到单个-a
(存档)开关中,因此我们只需一个标志即可使用所有最常见的选项。另请注意目录上的尾部斜杠,这将避免在目标位置创建额外的目录级别。$ rsync -a /src/ /dst/
除非发生错误,否则前面的命令不会产生太多输出。要获取有关当前传输的更多信息,您可以向命令添加
-v
(详细)选项。下面的语法可能是您将看到的最常见的 rsync 形式。这是您应该尽力记住的一个,因为您可能会经常使用它。$ rsync -av /src/ /dst/
默认情况下,rsync 不会从目标目录中删除任何文件。它只会传输新文件和对当前文件所做的更改。如果要删除目标目录中的无关文件,可以在命令中添加
--delete
选项。$ rsync -av --delete /src/ /dst/
如果您想查看 rsync 计划进行哪些更改,在实际传输更改之前,您可以在命令中使用
-n
或--dry-run
标志。如果您还使用--delete
选项,这尤其是一个好主意,因为它会向您显示要删除哪些文件。$ rsync -avn --delete /src/ /dst/
到目前为止,我们只展示了适用于同一系统上的目录的 rsync 示例。 rsync 最强大的功能之一是它还可以与远程系统一起使用。要通过 SSH 运行 rsync,我们可以在命令中添加 -e ssh 选项。还要在命令中指定远程 SSH 用户和目标目录。输入命令后,系统将提示您输入 SSH 密码。
$ rsync -av -e ssh /src/ user@remote:/path/to/dst/
如果远程服务器在默认端口 (22) 以外的端口上接受 SSH 连接,则可以使用以下命令语法指示 rsync 连接到该端口。此示例假设 SSH 在端口 2200 上运行。
$ rsync -av -e 'ssh -p 2200' /src/ user@remote:/path/to/dst/
中级 rsync 示例
使用 rsync 进行远程传输时,
--partial
和--progress
选项非常有用。如果先前的同步中断,它们将恢复部分传输,并分别向您显示所有文件的当前传输进度。您可以使用-P
选项将这两个功能组合到一个标志中。$ rsync -avP -e ssh /src/ user@remote:/path/to/dst/
另一个仅与远程传输相关的有用选项是
-z
标志,它可以启用文件压缩。这可以节省一点带宽并加快数据传输速度,但会花费系统一些 CPU 使用率来在传输文件之前对其进行压缩。$ rsync -avPz -e ssh /src/ user@remote:/path/to/dst/
默认情况下,rsync 检查文件的大小和修改时间以检测是否已进行更改。如果源目录和目标目录中的文件具有相同的大小和运行时间,则 rsync 会跳过该文件。在 99.99% 的情况下,这是检测文件是否已更改的充分方法。但还有
-c
选项可以检查每个文件的校验和。这是验证源中的文件是否与目标中的相应文件不同的万无一失的方法,但是,它会极大地减慢整个 rsync 过程,因为 CPU 花费大量时间来确定每个文件的校验和。$ rsync -avc /src/ /dst/
您不希望 rsync 传输到目标的某些文件或目录是很常见的 - 一个常见的例子是缓存目录。您可以使用
--exclude
选项和以下命令语法排除文件或目录。请注意,您需要使用 rsync 命令中源目标的相对路径(换句话说,以下示例意味着我们排除的目录位于/src/.cache/
中。$ rsync -av --exclude .cache /src/ /dst/
您还可以在一个文本文件中列出多个目录和文件,每一行一个。然后,使用
--exlude-from
选项告诉 rsync 包含排除列表的文本文件的位置。$ rsync -av --exclude-from exclusions.txt /src/ /dst/
高级 rsync 示例
请记住,您还可以使用通配符来匹配要排除的文件名的某些模式。例如,您可以使用以下 rsync 命令排除所有 .jpg 和 .txt 文件。
$ rsync -av --exclude *.jpg --exclude *.txt /src/ /dst/
当我们使用
-P
选项时,rsync 为我们提供了一些有关文件传输的统计信息,如前面的示例所示。当整个传输完成时,它还为我们提供了统计数据摘要。这些可能有点难以阅读,因为所有内容都以字节为单位显示。为了使文件大小更易于理解,我们可以将-h
标志附加到我们的命令中。$ rsync -avh /src/ /dst/
在我们的 rsync 的输出中,正在创建、更新、更改权限等的文件之间没有区别。要查看每个文件的逐项更改(如果您稍后需要筛选日志,这非常方便),您可以使用
-i
选项。$ rsync -avi /src/ /dst/
您可以使用常用的 bash 运算符(例如
>
、>>
等)重定向 rsync 的输出。以下命令会将 rsync 的所有输出保存到文本文件,而不是您的终端屏幕。但是,如果遇到任何错误,您的终端中仍会显示错误。$ rsync -av /src/ /dst/ > rsync.log
主控 rsync 示例
如果您想查看 rsync 的输出,同时将其记录到文件以供以后参考,您可以将命令通过管道传输到
tee
。$ rsync -av /src/ /dst/ | tee rsync.log
rsync 具有许多精细的功能,可让您控制确切传输的内容。几乎每个 rsync 命令都包含的
-a
选项可以被各种标志覆盖。例如,请参阅以下命令,其中我们指示 rsync 不要更新文件的所有者、组和权限,尽管使用了-a
选项。$ rsync -av --no-perms --no-owner --no-group /src/ /dst/
将
-H
选项与 rsync 一起使用以保留硬链接。如果没有此选项,rsync 会将硬链接作为文件传输。$ rsync -avH /src/ /dst/
使用
-l
选项将符号链接复制为符号链接,或使用-L
选项将符号链接转换为远程目标中的引用文件或目录。请注意,-a
选项自动暗示-l
。$ rsync -avL /src/ /dst/
如果需要节省一些带宽,可以使用
--max-size
选项指示 rsync 仅传输低于特定大小的文件。以下示例将仅传输大小低于 500 KB 的文件。$ rsync -av -e ssh --max-size='500k' /src/ user@remote:/path/to/dst/
结束语
在本指南中,我们学习了 Linux 中 rsync 命令的 20 个不同的实用命令示例。正如您从大量示例中看到的那样,rsync 是一个极其通用的工具,可以从用户那里获取非常具体的指令。这使得它非常适合作为备份或文件传输工具,因为我们可以根据需要准确配置它。但这也意味着有很多学习选择。本教程向您展示了一些与 rsync 一起使用的最常见和最有用的选项,并且应该涵盖您遇到的大多数情况。