Rsync 实用指南:高效同步本地与远程目录

本文深入探讨了 Rsync 工具,一个在 Linux 和 Unix-like 系统中用于高效同步文件和目录的命令行实用程序。通过详细介绍其核心概念、基本语法、本地与远程同步机制,以及诸如 --dry-run、--delete、--exclude 等关键选项,旨在帮助开发者掌握 Rsync,实现可靠的数据备份、目录镜像和自动化任务。文章还包含了常见问题排查和最佳实践,确保您能够自信地使用 Rsync 管理文件。

引言

在日常的系统管理和开发工作中,高效地同步文件和目录是一项核心任务。无论是进行数据备份、部署应用代码,还是维护服务器文件结构,一个可靠且高效的工具都至关重要。rsync,即 remote sync(远程同步),正是一款为此目的而生的命令行实用程序。

rsync 最显著的特点是其增量传输算法 (delta-transfer algorithm)。它能够智能地识别源文件和目标文件之间的差异,并只传输文件发生变化的部分,而不是每次都复制整个文件。这使得 rsync 在后续同步,或更新包含少量修改的大文件时,相比 cp (copy) 或 scp (secure copy) 等传统工具,具有极高的效率和速度优势。

本指南将带您全面了解 rsync 的用法。我们将从基本语法入手,学习如何在本地和远程系统之间传输文件,探讨 -a (archive) 归档模式、--delete 目录镜像、--dry-run 模拟运行等常用选项。此外,我们还将深入了解如何利用 cron 自动化同步任务,以及如何解决使用 rsync 时可能遇到的常见问题。

关键要点

  • rsync 是一款高效的文件同步工具,通过增量传输算法只复制文件中发生变化的部分,从而最大程度地减少数据传输量。
  • 源路径末尾的斜杠 / 对 rsync 的行为至关重要,它决定了 rsync 是复制目录的内容还是目录本身。
  • 在执行任何可能修改文件的 rsync 命令前,务必使用 --dry-run (或 -n) 标志进行测试运行,以预览操作结果,避免不必要的损失。
  • 对于大多数同步场景,推荐使用 -a (archive) 归档标志,因为它能递归同步并保留文件权限、所有者、修改时间等关键属性。
  • 要创建源目录的精确镜像,需要使用 --delete 选项,这会删除目标目录中源目录不存在的文件。使用此选项时更应谨慎并结合 --dry-run。
  • 进行远程传输时,-z 标志可以压缩文件数据以减少网络使用,而 -P 标志则能显示传输进度并支持断点续传。
  • rsync 通过 SSH 协议进行安全的远程操作,支持将文件“推送”到远程系统,或从远程系统“拉取”文件。
  • 可以使用 cron 自动化 rsync 同步任务,但需要注意使用绝对路径和配置 SSH 免密密钥认证。

前提条件

为了更好地实践 rsync 在本地与远程系统之间同步文件的操作,您需要准备两台机器,分别作为您的本地计算机和远程服务器。这两台机器可以是虚拟私有服务器 (VPS)、虚拟机、容器,或者配置妥当的个人计算机。

如果您计划使用服务器进行练习,建议为它们设置管理用户并配置防火墙。您可以参考相关文档完成服务器的初始设置。

无论您选择何种机器类型,都应在两台机器上生成 SSH 密钥,并将彼此的公钥添加到对方的 authorized_keys 文件中,以实现 SSH 免密登录。这将确保 rsync 可以安全、自动化地进行远程文件传输。

Rsync 简介

rsync 是一款功能强大的命令行工具,专注于高效的文件和目录同步。它可以在同一机器的不同目录之间,或通过网络连接的不同机器之间复制数据。因其卓越的可靠性和多功能性,rsync 已成为大多数 Linux 和 Unix-like 操作系统默认安装的组件。

rsync 与 cp (copy) 或 scp (secure copy) 等工具最主要的区别在于它采用了增量传输算法 (delta-transfer algorithm)。在文件传输之前,rsync 会比较源文件和目标文件。默认情况下,它通过检查文件的修改时间和大小来识别变更。如果文件已被修改,算法会精确地确定文件中哪些部分发生了变化,并仅传输这些差异。相比之下,scp 和 cp 每次都会复制整个文件。这种增量传输方法极大地减少了数据传输量,使得 rsync 在后续同步或更新少量修改的大文件时表现出非凡的速度。

这种高效性使 rsync 成为各种任务的理想选择,包括创建增量备份、镜像整个目录结构以实现冗余,以及部署应用程序代码。它通过 SSH 进行安全的远程传输,并提供丰富的选项,如 --delete (用于镜像) 和 --exclude (用于过滤),赋予用户对同步过程的精确控制。

理解 Rsync 语法

rsync 的语法结构与 ssh、scp 和 cp 等其他命令行工具相似。

首先,我们通过以下命令切换到用户主目录:

cd ~

接着,创建两个测试目录:

mkdir dir1
mkdir dir2

现在,向 dir1 目录中添加 100 个空文件作为测试数据:

touch dir1/file{1..100}

确认 dir1 中已创建了 100 个文件:

ls dir1

输出将显示 file1 到 file100 等文件列表。而 dir2 目前还是一个空目录。

要将 dir1 的内容同步到 dir2(在同一系统上),我们将使用 rsync 命令,并添加 -r (recursive,递归) 标志,这是目录同步所必需的:

rsync -r dir1/ dir2

推荐选项:使用 -a (archive) 标志

更常用且推荐的方式是使用 -a 归档标志。它是一个组合标志,代表“archive”。该标志不仅递归同步,还会保留符号链接 (symbolic links)、特殊文件和设备文件、修改时间、组、所有者和文件权限。它比单纯使用 -r 更能确保目标目录成为源目录的精确副本。

使用 -a 标志执行相同的同步命令:

rsync -a dir1/ dir2

源路径末尾斜杠 / 的关键作用

请注意上述两个命令中,第一个参数 dir1/ 末尾的尾部斜杠 /:

rsync -a dir1/ dir2

这个尾部斜杠表示 rsync 将复制 dir1 目录内的所有内容(即 file1 到 file100),并直接放置到 dir2 中。最终 dir2 的结构会是 ~/dir2/[files]。

如果省略尾部斜杠,例如 rsync -a dir1 dir2,rsync 将复制 dir1 目录本身,并将其放置到 dir2 内部。结果将是 ~/dir2/dir1/[files] 这样的嵌套结构。

使用 --dry-run 强调测试以防范错误

在执行任何 rsync 命令之前,尤其是那些涉及远程目标或具有破坏性选项(如 --delete)的命令,进行测试运行至关重要。rsync 提供了一个安全且简单的方法来实现这一点:使用 --dry-run 标志(或其简写 -n)。

干运行 (dry run) 会模拟整个同步过程,但不会进行任何实际的更改。它会准确地向您展示哪些文件将被复制、更新或删除。

要执行干运行,只需在命令中添加 -n。通常它会与 -v (verbose,详细输出) 结合使用,以获得清晰、易读的操作列表。

rsync -anv --delete source_directory/ destination_directory/

干运行示例输出:

sending incremental file list
deleting old_file.txt
./
new_file.txt
updated_file.txt

sent 218 bytes  received 38 bytes  512.00 bytes/sec
total size is 1024  speedup is 4.00 (DRY RUN)

此输出告诉您,如果实际运行该命令,rsync 将会删除 old_file.txt,创建 new_file.txt,并更新 updated_file.txt。

务必在以下情况进行干运行:

  • 首次在特定任务中使用 --delete 标志时。
  • 您构建了复杂的 --include 或 --exclude 规则集时。
  • 您正在将数据同步到关键位置,例如生产服务器时。

花几秒钟运行 --dry-run 可以防止不可逆的数据丢失,并为您省去昂贵的错误。

本地与远程文件同步:推与拉

要使用 rsync 与远程系统同步文件,您需要在本地和远程机器之间配置好 SSH 访问,并且两台系统都安装了 rsync。一旦确认可以通过 SSH 连接,就可以开始同步文件了。其基本语法与 scp 相似,源路径作为第一个参数,目标路径作为第二个参数。

推(Push):从本地机器同步到远程机器

“推”操作是指将文件从您的本地机器发送到远程服务器。这通常用于部署应用程序代码或备份本地数据。

让我们使用之前创建的包含 100 个空文件的 dir1 目录。我们将把这个目录同步到远程服务器。命令结构将本地目录作为源,远程系统作为目标。

在此示例中,我们希望传输 dir1 目录本身,而不仅仅是其内容,因此我们将在源路径上省略尾部斜杠。

rsync -a ~/dir1 username@remote_host:destination_directory

我们来分解这个命令:

  • -a:归档标志,递归同步并保留权限、修改时间及其他属性。
  • ~/dir1:本地源目录。
  • username@remote_host:远程系统的连接凭据。
  • ::一个冒号,用于分隔远程主机信息和文件路径。
  • destination_directory:远程服务器上您希望放置文件的位置。例如,~/ 将其放置在远程用户的主目录中。

执行此命令后,远程服务器的 destination_directory 中将存在一个名为 dir1 的目录。

拉(Pull):从远程机器同步到本地机器

“拉”操作则相反:它从远程服务器检索文件并复制到您的本地机器。这对于下载服务器日志或获取备份非常有用。

要执行拉操作,只需在命令中颠倒源和目标的顺序。远程系统现在是源(第一个参数),本地系统是目标(第二个参数)。

假设 dir1 目录位于远程系统而非您的本地系统。要将其拉取到您的本地机器,语法如下:

rsync -a username@remote_host:/path/to/remote/dir1 /path/to/local/destination

在这里,rsync 将连接到 remote_host,进入 /path/to/remote/dir1 目录,并将其内容复制到您本地计算机的 /path/to/local/destination。

远程同步中尾部斜杠的关键作用

与本地传输一样,源目录上的尾部斜杠 (/) 至关重要,因为它决定了实际复制的内容。

再次考虑“推”的示例:

  • rsync -a ~/dir1 remote_host:~/backups:此命令复制目录本身。远程服务器上的结果是 ~/backups/dir1 处的一个新目录。
  • rsync -a ~/dir1/ remote_host:~/backups:此命令带有尾部斜杠,仅复制 ~/dir1 的内容。它将文件(file1, file2 等)直接放置在 ~/backups 中。目标中不会创建 dir1 目录本身。

始终仔细检查源路径上的尾部斜杠,以确保您传输的内容与预期完全一致。在执行远程传输之前,强烈建议进行快速的 --dry-run 测试。

使用其他 Rsync 选项

Rsync 提供了许多选项来修改其默认行为,例如您在上一节中了解到的标志选项。

提高传输速度和韧性

虽然 -a 标志最常用,但其他一些标志可以改善传输过程,尤其是在通过网络连接时。

  • 如果您传输的文件尚未被压缩(例如文本文件),可以通过添加 -z 选项来启用压缩,从而减少网络传输量:

    rsync -az source destination
    
  • -P 标志也非常有用。它结合了 --progress(提供传输进度条)和 --partial(允许您恢复中断的传输)两个功能:

    rsync -azP source destination
    

    运行上述命令后,您将看到类似以下的输出,其中包含进度信息:

    sending incremental file list
    created directory destination
    source/
    source/file1
                    0 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=99/101)
    sourcefile10
                    0 100%    0.00kB/s    0:00:00 (xfr#2, to-chk=98/101)
    source/file100
                    0 100%    0.00kB/s    0:00:00 (xfr#3, to-chk=97/101)
    ...
    

    如果再次运行该命令,由于没有进行任何更改,您将收到一个简短的输出。这说明 Rsync 能够智能地利用修改时间来判断文件是否发生变化:

    rsync -azP source destination
    
    sending incremental file list
    sent 818 bytes  received 12 bytes  1660.00 bytes/sec
    total size is 0  speedup is 0.00
    

    现在,假设您使用类似以下命令更新了其中一些文件的修改时间:

    touch dir1/file{1..10}
    

    然后,如果再次运行带有 -azP 标志的 rsync,您会注意到 Rsync 如何智能地只重新复制那些被更改的文件:

    rsync -azP source destination
    
    sending incremental file list
    file1
                  0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=99/101)
    file10
                  0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=98/101)
    file2
                  0 100%    0.00kB/s    0:00:00 (xfer#3, to-check=87/101)
    file3
                  0 100%    0.00kB/s    0:00:00 (xfer#4, to-check=76/101)
    ...
    

使用 --delete 镜像目录

为了使两个目录真正保持同步,有必要在源目录中文件被删除时,也从目标目录中删除相应的文件。默认情况下,rsync 不会从目标目录中删除任何内容。

您可以使用 --delete 选项来改变这一行为。在使用此选项之前,务必先使用 -n (即 --dry-run 选项) 进行测试运行,以防止不必要的数据丢失:

rsync -an --delete source destination

使用 --exclude 和 --include 进行高级过滤

如果您希望排除正在同步的目录中的某些文件或子目录,可以使用 rsync 强大的过滤功能。关键在于 rsync 会按照您提供的规则顺序进行评估;第一个匹配文件的规则将生效。

排除文件和目录

您可以使用 --exclude 标志阻止特定文件或目录被传输。您可以使用通配符模式 (*) 来匹配多个文件。

例如,要同步一个项目目录,同时排除临时文件、日志文件和 dist/ 构建目录,您可以运行:

rsync -av --exclude='*.tmp' --exclude='*.log' --exclude='dist/' source_directory/ destination_directory/
  • --exclude='*.tmp':排除所有以 .tmp 结尾的文件。
  • --exclude='*.log':排除所有以 .log 结尾的文件。
  • --exclude='dist/':排除 dist 目录及其内容。尾部斜杠确保它只匹配目录,而不是名为 dist 的文件。

包含文件同时排除其他文件

--include 标志更为复杂,它通常与 --exclude 结合使用,用于覆盖特定模式的排除规则。

让我们完善前面的示例。假设您想排除 config/ 目录中的所有文件,但除了 config/production.json。要实现这一点,您必须将 --include 规则放在 --exclude 规则之前。

rsync -av --include='config/production.json' --exclude='config/*' source_directory/ destination_directory/

rsync 处理此命令的逻辑如下:

  1. 它检查 config/production.json。--include='config/production.json' 规则匹配,因此 rsync 将此文件标记为传输,并停止对其应用其他规则。
  2. 然后,它检查另一个文件,例如 config/development.json。include 规则不匹配。它会移到下一条规则 --exclude='config/*',这条规则匹配。因此,该文件被排除。

如果顺序颠倒,--exclude='config/*' 将首先匹配 config 目录中的所有文件,并将其排除,--include 规则将失去被评估的机会。

使用 --backup 创建备份

最后,Rsync 的 --backup 选项可用于存储重要文件的备份。它与 --backup-dir 选项结合使用,后者指定了备份文件应存储的目录。当目标中的文件被更新或删除时,其旧版本会首先被移动到指定的备份目录中:

rsync -a --delete --backup --backup-dir=/path/to/backups /path/to/source destination

使用 Cron Job 自动化 Rsync 任务

您可以使用 cron 自动化 rsync 任务。cron 是一个基于时间的作业调度程序,在类 Unix 操作系统中是标准组件。cron 守护进程(一个后台进程)会按照预设的时间表运行命令。这对于执行定期、无人值守的备份尤其有用,无需手动干预。

cron 任务是定义在特殊文件 crontab 中的单个命令。系统上的每个用户都可以拥有自己的 crontab,用于调度以其权限运行的作业。要编辑您的用户专属 crontab,请运行以下命令:

crontab -e

crontab 条目由两部分组成:调度时间和要执行的命令。调度时间由五个字段定义,以特定顺序表示时间。

# ┌───────────── 分钟 (0 - 59)
# │ ┌───────────── 小时 (0 - 23)
# │ │ ┌───────────── 月中的日期 (1 - 31)
# │ │ │ ┌───────────── 月份 (1 - 12)
# │ │ │ │ ┌───────────── 星期几 (0 - 6) (星期日到星期六)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * <要执行的命令>

星号 (*) 是一个通配符,表示“每一个”。以下是一些示例调度时间,以说明其工作原理:

  • * * * * * - 每天每分钟运行一次。
  • 30 * * * * - 每小时的第 30 分钟运行一次。
  • 0 18 * * 1-5 - 每个工作日(周一至周五)的下午 6:00 (18:00) 运行一次。
  • 0 4 * * 0 - 每周日的凌晨 4:00 运行一次。
  • */15 * * * * - 每隔 15 分钟运行一次。

示例:每日备份

让我们创建一个 cron 任务,每天凌晨 3:00 运行 rsync,将本地目录 (/var/www/html) 备份到远程备份服务器。

将以下行添加到您的 crontab 中:

0 3 * * * rsync -a --delete /var/www/html/ user@remote_host:/path/to/backups/
  • 调度时间 (0 3 * * *):这表示“在每天每月的每周中的每天的第 3 小时的第 0 分钟”。
  • 命令 (rsync...):这是一个标准的 rsync 命令,用于镜像目录。

Cron Job 中 Rsync 的最佳实践

在通过 cron 运行命令时,务必记住它们在一个非交互式、最小化的 shell 环境中运行。为了使您的自动化 rsync 任务可靠,请遵循以下最佳实践:

  • 使用绝对路径:cron 没有与您常规用户 shell 相同的 PATH 环境变量。这意味着它可能不知道 rsync 可执行文件的位置。您应该始终使用可执行文件和目录的完整路径。您可以通过运行 which rsync 来查找 rsync 的路径(它通常是 /usr/bin/rsync)。同样,使用 /home/user/ 而不是 ~/。

  • SSH 密钥认证:cron 任务无法提示您输入密码。在将 rsync 传输自动化到远程主机之前,您必须设置好 SSH 免密密钥认证。

  • 输出处理和日志记录:默认情况下,cron 会将命令的任何输出通过电子邮件发送给拥有该 crontab 的用户。为了避免在每次备份成功运行后都收到电子邮件,您可以管理输出。

    • 抑制所有输出:要丢弃所有输出(包括成功输出和错误),请将其重定向到 /dev/null。这对于简单、非关键的作业很有用。语法 > /dev/null 2>&1 意味着“将标准输出重定向到 /dev/null,然后将标准错误 (2) 重定向到与标准输出 (&1) 相同的位置”。
    • 记录到文件(推荐):一种更健壮的方法是将输出记录到文件中。这样,您就有了传输记录,可以检查是否存在错误。使用 >> 会将输出附加到日志文件中,而不是每次都覆盖它。

常见问题与故障排除

本节提供了一个以问题为导向的指南,帮助您解决最常见的 rsync 问题。每个主题都描述了一个常见问题,解释了如何解决它,然后提供了防止其在未来发生的最佳实践。

1. 命令行为与预期不符

  • 常见问题:“我的 rsync 命令执行结果出乎意料!”

您运行了一个命令,但结果并非您所愿,文件被误删,或者数据最终存放在了错误的目录中。

  • 故障排除步骤:

为了诊断问题,您需要查看 rsync 认为您想要做什么。重新运行您的命令,但添加 -anv 标志(archive 归档模式,dry-run 模拟运行,verbose 详细输出)。这将生成一份计划操作的报告,而不会进行任何实际更改。

rsync -anv source/ destination/

仔细审查详细输出。它将准确地显示哪些文件被作为目标,帮助您找到路径中的拼写错误或逻辑缺陷。

  • 最佳实践:始终使用 --dry-run 进行测试

避免意外的最佳方法是在执行任何修改数据的命令之前,始终执行模拟运行。--dry-run 标志 (-n) 是您最重要的安全网。

2. 创建了多余的目录

  • 常见问题:“我的目标目录中创建了一个额外、不需要的目录。”

您尝试将 source 目录的内容复制到 backups 中,但最终却多了一个像 backups/source/ 这样的文件夹。

  • 故障排除步骤:

这几乎总是由于源路径缺少尾部斜杠造成的。

  • 问题所在:您的命令可能类似于 rsync -a source backups。没有尾部斜杠,rsync 旨在复制 source 目录本身。
  • 解决方案:在源路径末尾添加一个尾部斜杠,以仅复制其内容。正确的命令是 rsync -a source/ backups。
  • 最佳实践:掌握尾部斜杠 (/)

理解尾部斜杠是基础。始终仔细检查您的源路径:使用 source/ 复制内容,使用 source 复制目录本身。

3. 不正确的权限或“权限拒绝”错误

  • 常见问题:
    1. “目标服务器上的文件权限、所有者或时间戳不正确。”
    2. 传输失败并出现“Permission denied”(权限拒绝)错误。
  • 故障排除步骤:
    • 对于不正确的权限:您可能使用了 rsync -r 而不是 rsync -a。-r 标志只处理递归,而 -a 才能保留权限和其他关键文件元数据。
    • 对于“权限拒绝”:这是一个文件系统问题,而不是 rsync 错误。请确认运行命令的用户对源文件具有读取权限,并对目标目录具有写入权限。
  • 最佳实践:使用归档标志 (-a)

为了确保真正准确的同步,请始终使用 -a (archive) 归档标志。它会保留权限、所有权、修改时间以及符号链接,确保目标是源的完美副本。

4. 目标目录残留旧文件

  • 常见问题:“我从源目录删除了文件,但它们仍然存在于目标目录中。”

您正在尝试使两个目录完美镜像,但目标目录却被源目录中不再存在的旧文件所堆积。

  • 故障排除步骤:

这是 rsync 的默认安全行为。它只会添加或更新文件。要使目标成为精确镜像,您必须显式添加 --delete 标志。这会告诉 rsync 从目标目录中删除源目录中不存在的任何文件。

  • 最佳实践:有意地使用 --delete 进行镜像

请理解,rsync 默认情况下并非一个镜像工具。仅当您的目标是使目标成为源的精确副本时才使用 --delete 标志,并且始终首先将其与 --dry-run 结合使用,以防止意外数据丢失。

5. 自动化问题 (Cron Job & 脚本)

  • 常见问题:
    • 脚本挂起或要求输入密码。
    • Cron 任务失败并出现“command not found”错误。
    • 远程传输意外缓慢。
  • 故障排除步骤:
    • 挂起/密码提示:您的 SSH 密钥未正确配置用于免密登录。手动测试您的连接 (ssh user@remote_host) 以确认它无需密码即可连接。
    • “command not found”:Cron 在最小化环境中运行。在您的脚本中使用 rsync 可执行文件的绝对路径(例如,/usr/bin/rsync)。
    • 传输缓慢:如果您正在传输可压缩数据(如文本文件),请添加 -z 标志以启用即时压缩并加速网络传输。
  • 最佳实践:在脚本中明确指定

为了实现可靠的自动化,您的脚本必须明确。始终使用绝对路径,确保 SSH 免密密钥认证正常工作,并将输出记录到文件中以便审计和调试。

常见问题解答 (FAQs)

1. 如何使用 Rsync 将本地目录同步到远程服务器?

要将本地目录与远程服务器同步,请使用 rsync 命令,其中本地路径为源,远程路径为目标。该命令包含用于在传输过程中保留文件属性和压缩数据的选项。

执行此任务的标准命令是:

rsync -avz /path/to/local/dir/ user@remote_host:/path/to/remote/dir/

命令解析:

  • rsync:命令行实用程序。
  • -a (archive):此选项保留文件元数据,如权限、时间戳和所有权。它是多个标志 (-rlptgoD) 的便捷简写。
  • -v (verbose):提供详细输出,列出正在传输的文件。
  • -z (compress):在传输过程中压缩文件数据,这可以在较慢的网络连接上加快处理速度。
  • /path/to/local/dir/:源目录。尾部斜杠 (/) 很重要,因为它告诉 rsync 复制目录的内容。如果没有它,目录 dir 本身将被复制到目标中。

此命令可以高效地同步两个目录。在后续运行中,rsync 的增量传输算法确保只发送新的或修改过的文件,从而节省时间和带宽。

2. 如何使用 Rsync 从远程服务器复制文件到我的本地机器?

要从远程服务器复制文件,只需在 rsync 命令中颠倒源和目标参数。远程路径成为源,本地路径成为目标。

命令结构是:

rsync -avz user@remote_host:/path/to/remote/dir/ /path/to/local/dir/

此命令对于从服务器创建备份或检索更新的项目文件很有用。就像本地到远程传输一样,rsync 将只复制源和目标之间的差异,使其比 scp 更适合重复下载。

3. scp 和 rsync 有什么区别?

主要区别在于 scp 每次都复制整个文件,而 rsync 使用增量传输算法只复制文件发生变化的部分。这使得 rsync 在同步目录或更新大文件时效率显著提高。

特性 scp (Secure Copy) rsync (Remote Sync)
传输方法 每次传输都会复制整个文件。 仅复制文件发生变化的块和字节。
效率 最适合一次性传输。 对于后续或增量传输非常高效。
主要用例 简单、安全的文件复制。 目录同步、增量备份和镜像。
灵活性 文件传输的基本选项。 具有排除 (--exclude)、删除 (--delete) 和测试 (--dry-run) 的高级选项。

虽然这两个实用程序都通过 SSH 安全地传输文件,但 rsync 为重复同步任务提供了更高的灵活性和性能。

4. 如何使用 Rsync 配合 SSH 密钥?

rsync 使用 SSH 作为其默认传输机制,因此它会自动与您现有的 SSH 密钥认证集成。如果您的公钥已在远程服务器上获得授权,rsync 将无需密码即可连接。

在大多数情况下,如果您的 SSH 密钥存储在默认位置(例如,~/.ssh/id_rsa),命令很简单:

rsync -avz /local/path user@remote_host:/remote/path

如果您需要指定非标准的身份文件,请使用 -e 选项将自定义命令传递给 SSH:

rsync -avz -e "ssh -i ~/.ssh/custom_key" /local/path user@remote_host:/remote/path

此功能对于使用脚本或 cron 任务自动化备份尤其有用,因为它允许 rsync 无需手动干预即可运行。

5. 如何从 Rsync 中排除某些文件或目录?

要阻止特定文件或目录被传输,请使用 --exclude 选项。您可以指定模式并多次使用该选项。

例如,要同步一个软件项目,同时排除 node_modules 目录和所有日志文件:

rsync -avz --exclude 'node_modules' --exclude '*.log' /local/path/ user@remote_host:/remote/path/

为了管理多个排除模式,最好将它们列在一个单独的文件中(例如,exclude.txt):

node_modules
*.log
.DS_Store

然后,使用 --exclude-from 选项引用此文件:

rsync -avz --exclude-from='exclude.txt' /local/path/ user@remote_host:/remote/path/

这种方法使您的命令保持简洁,并使您的排除规则易于维护,这在同步复杂的代码库或数据集时非常有用。

6. --delete 选项在 Rsync 中有什么作用?

--delete 选项指示 rsync 从目标目录中删除那些在源目录中不存在的文件。此操作可确保目标成为源的精确镜像。

注意: 此选项会永久删除目标上的文件。建议在生产环境中使用之前进行测试运行。

考虑以下场景:

  • 源包含:file_A.txt, file_B.txt
  • 目标包含:file_A.txt, file_C.txt

运行以下命令:

rsync -avz --delete /local/source/ user@remote_host:/remote/destination/

执行后,目标将被修改为与源完全匹配:file_B.txt 将被添加,而 file_C.txt 将被删除。

7. 如何在不实际复制文件的情况下测试 rsync 命令?

要预览 rsync 命令将执行的操作而不进行任何更改,请使用 --dry-run 选项(或其别名 -n)。干运行会模拟传输并报告哪些文件将被创建、更新或删除。

这是一种安全地验证您的语法、路径和选项的方法,然后再执行命令。在使用 --delete 时,它尤为重要。

干运行命令示例:

rsync -avzn --delete /local/path/ user@remote_host:/remote/path/

输出将列出所有建议的更改。一旦您确认操作正确,您可以再次运行命令,但不带 -n 标志,以执行实际的同步。

结论

rsync 是一款功能多样的实用程序,可用于本地和跨网络的文件管理。本指南涵盖了其基本语法、如何通过 SSH 安全传输文件,以及使用 -a 标志保留文件属性和 --delete 标志创建目录精确镜像等重要标志。您还学习了如何使用 --dry-run 安全地测试命令,并使用 cron 自动化同步任务。

掌握这些技能后,您将能够构建可靠高效的文件传输工作流,设计复杂的备份操作,并以更强的控制力管理您的数据。

关于

关注我获取更多资讯

月球基地博客公众号二维码,扫码关注获取更多 AI 与编程资讯
📢 公众号
月球基地博客作者个人微信二维码,扫码交流 AI 与编程话题
💬 个人号
使用 Hugo 构建
主题 Stack 由 Jimmy 设计