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

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

阅读时长: 19 分钟
共 9075字
作者: eimoon.com

引言

在日常的系统管理和开发工作中,高效地同步文件和目录是一项核心任务。无论是进行数据备份、部署应用代码,还是维护服务器文件结构,一个可靠且高效的工具都至关重要。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 操作系统默认安装的组件。

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

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

理解 Rsync 语法

rsync 的语法结构与 sshscpcp 等其他命令行工具相似。

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

cd ~

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

mkdir dir1
mkdir dir2

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

touch dir1/file{1..100}

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

ls dir1

输出将显示 file1file100 等文件列表。而 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 目录内的所有内容(即 file1file100),并直接放置到 dir2 中。最终 dir2 的结构会是 ~/dir2/[files]

如果省略尾部斜杠,例如 rsync -a dir1 dir2rsync 将复制 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. scprsync 有什么区别?

主要区别在于 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 自动化同步任务。

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

关于

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计