引言
在日常的系统管理和开发工作中,高效地同步文件和目录是一项核心任务。无论是进行数据备份、部署应用代码,还是维护服务器文件结构,一个可靠且高效的工具都至关重要。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 destinationsending 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 destinationsending 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 处理此命令的逻辑如下:
- 它检查
config/production.json。--include='config/production.json'规则匹配,因此rsync将此文件标记为传输,并停止对其应用其他规则。 - 然后,它检查另一个文件,例如
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. 不正确的权限或“权限拒绝”错误
- 常见问题:
- “目标服务器上的文件权限、所有者或时间戳不正确。”
- 传输失败并出现“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 密钥未正确配置用于免密登录。手动测试您的连接 (
- 最佳实践:在脚本中明确指定
为了实现可靠的自动化,您的脚本必须明确。始终使用绝对路径,确保 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 自动化同步任务。
掌握这些技能后,您将能够构建可靠高效的文件传输工作流,设计复杂的备份操作,并以更强的控制力管理您的数据。
关于
关注我获取更多资讯