使 Linux 文件和目录与 rsync 保持同步

管理员(或普通用户)经常需要备份文件或使它们在多个位置(包括本地和远程)之间保持同步,而无需每次都传输和覆盖目标上的所有文件。对于此类任务,系统管理员最有用的工具之一是rsync.

该rsync工具可以递归地导航目录结构并使用任何新/更改/删除的文件更新第二个位置。它会在发送文件之前检查目标中是否存在文件,从而为跳过的所有内容节省带宽和时间。此外,rsync还提供了将目录结构(甚至单个文件)与另一个目标(本地或远程)同步的能力。为了有效地完成此操作,默认情况下,它将检查文件的修改时间。它还可以对源和目标上的文件进行快速哈希检查,以确定是否需要传输新副本,从而可能节省大量时间和带宽。

由于它默认与大多数 Linux 发行版一起打包,因此应该很容易上手。macOS、*BSD 和其他类 Unix 操作系统也是如此。使用起来rsync很容易,可以在命令行、脚本中使用,并且一些工具将其包装在一个漂亮的 UI 中以管理任务。

在命令行上,rsync由于它是一个灵活的工具,因此通常使用少量参数来定义它的行为方式。以最简单的形式,rsync可以被告知确保一个位置的文件在文件系统的第二个位置应该是相同的。

rsync

# rsync file1.txt file2.txt

通常需要传递rsync一些参数以确保事物按照人类期望的方式运行。传递诸如-a“存档”之类的参数是很常见的,因为它是一个“元参数”,会自动为您调用其他一些参数。-a相当于,-rlptgoD分解为:

• -r: 通过目录递归(而不是只处理当前目录中的文件)

• -l: 将符号链接复制为新符号链接

• -p: 保留权限

• -t:保留修改时间

• -g:保留组所有权

• -o:保留用户所有权(在处理其他用户的文件时仅限于超级用户)

• -D:复制设备文件

通常这可以按照用户的需要进行,并且不需要进行重大更改。但是,其中一些可能与用户的需求相反,因此将其分解为特定功能可能是正确的答案。

其他值得注意的选项包括:

• -n:空运行命令而不传输文件

• --list-only:只显示rsync要传输的文件列表

• -P:显示每个文件的进度

• -v:显示整体进度,在完成时输出每个文件的信息

• -u:如果目标文件比源文件更新,则跳过更新

• -q: 静音模式。当不需要终端输出时,可用于包含在脚本中

• -c:使用校验和值来确定要跳过哪些文件,而不是修改时间和大小

• --existing: 只更新文件,但不创建丢失的新文件

• --files-from=FILE:从文本文件中读取列表源文件

• --exclude=PATTERN:使用 PATTERN 从同步中排除文件

• --exclude-from=FILE: 同上,但从文件中读取

• --include=PATTERN: 也用于否定排除规则

• --include-from=FILE: 同上,但从文件中读取

我个人的默认参数集rsync最终是-avuP(存档、详细输出、仅更新新文件,并显示正在完成的工作的进度)。

来源和目标

同步的源和目标是文件和目录。此外,rsync还提供通过 SSH 与远程系统交互的功能,这使用户无需设置网络共享即可将文件从一个地方同步到另一个地方。这意味着您可以在两端配置 SSH 密钥后轻松编写作业脚本rsync,无需手动登录以进行远程文件同步。

在这里分解语法:

• 运行rsync命令

• 使用上述-avuP参数

• 复制本地 Documents 目录

• 使用steve作为远程系统上的用户

• 远程系统称为文件服务器并且可以通过该名称访问的位置

• 相对路径显示在: - 之后,在这种情况下,这意味着将其放在Home目录本身

总结

有许多有用的方法可以利用rsync. 它通常就像一次性从命令行运行它来复制一组文件一样简单,而不必担心浪费时间复制目标上已经存在的东西。编写脚本,将其添加到cron作业中,并尝试使用不同的参数有助于为普通系统管理员实现更多目标。