Contents

Linux中的远程文件同步

1. 简介

在执行传输文件、备份文件夹或安装新软件等管理任务时,我们通常需要一个灵活、高效且安全的工具。rsync 是一个多功能工具,可以满足所有这些需求以及更多需求,而且它的效率很高。因此,对于 Linux 系统管理员或用户来说,学习如何使用rsync是一项不错的投资。

在本教程中,我们将学习如何使用rsync来同步文件和文件夹。我们将学习如何在本地系统以及远程机器上执行此操作。

2. 示例目录结构

首先,让我们创建一个示例目录结构。我们将使用它来运行我们的rsync命令:

$ mkdir dir1
$ echo test > dir1/file.txt
$ echo test2 > dir1/file2.txt
$ mkdir dir1/nested-dir
$ echo test3 > dir1/nested-dir/file3.txt
$ mkdir dir2

这将创建三个文件,一个位于*dir1/*内的嵌套目录中。让我们使用tree 命令检查它:

$ tree
dir1/
├── nested-dir
│ └── file3.txt
├── text-file2.txt
└── text-file.txt

3. 列出文件

作为我们的第一个示例,我们可以只使用rsync列出目录中的文件。这将使我们熟悉rsync的输出格式:

$ rsync dir1/
drwxrwxr-x 4,096 2021/04/04 11:38:24 .
-rw-rw-r-- 5 2021/04/04 10:02:32 text-file.txt
-rw-rw-r-- 5 2021/04/04 10:02:32 text-file2.txt
drwxrwxr-x 4,096 2021/04/04 11:38:24 nested-dir

它仅列出dir1/中的文件,忽略dir1/nested-dir/中的文件。为了使rsync递归遍历目录,我们使用*-r*标志:

$ rsync -r dir1/
drwxrwxr-x 4,096 2021/04/04 11:38:24 .
-rw-rw-r-- 5 2021/04/04 10:02:32 text-file.txt
-rw-rw-r-- 5 2021/04/04 10:02:32 text-file2.txt
drwxrwxr-x 4,096 2021/04/04 11:38:24 nested-dir
-rw-rw-r-- 6 2021/04/04 11:38:24 nested-dir/file3.txt

请注意,在**使用rsync时,在每个目录路径的末尾添加*/很重要。否则,rsync将假定它是一个文件。

4. 同步本地目录

rsync可用于同步本地目录。** rsync的一个重要特性是它只在一个方向上工作。**因此,如果我们想双向同步两个目录,我们应该运行rsync两次,改变目录顺序。

让我们同步dir1/dir2/

$ rsync -havun dir1/ dir2/

让我们看看这些命令行标志(h、a、v、u、n)的含义:

-h标志生成人类可读的输出。-a标志激活归档模式。这是*-rlptgoD*的快捷方式,这意味着:

  • *(-r)*递归遍历目录
  • *(-l)*将符号链接复制为符号链接
  • *(-p)*保留权限
  • *(-t)*保留修改时间
  • *(-g)*保留组
  • *(-D)*保留设备和特殊文件

-v 标志会增加详细程度以打印出所做操作的详细信息。-u标志激活更新。这将跳过接收器上较新的文件。-n标志进行试运行。试运行只模拟同步并列出输出,而不实际同步任何内容。在实际运行命令之前看看我们将要做什么是很有用的。

**通过在进行实际同步操作之前进行试运行 ( -n ),我们可以捕获可能导致数据丢失的用户错误。**因此,在使用rsync时,进行试运行是重要的第一步。

让我们运行命令并检查输出:

$ rsync -havun dir1/ dir2/
sending incremental file list
created directory dir2
./
text-file.txt
text-file2.txt
nested-dir/
nested-dir/file3.txt

如果我们确定这些文件是我们想要同步的文件,我们可以删除*-n*标志并运行实际同步:

$ rsync -havu dir1/ dir2/
sending incremental file list
created directory dir2
./
text-file.txt
text-file2.txt
nested-dir/
nested-dir/file3.txt
sent 358 bytes received 111 bytes 938.00 bytes/sec
total size is 16 speedup is 0.03

如果我们再次运行同步,rsync将不会检测到任何要同步的文件。因此,我们会看到,如果我们再次进行空运行,它不会输出任何文件进行同步:

$ rsync -havun dir1/ dir2/
sending incremental file list
sent 199 bytes received 13 bytes 424.00 bytes/sec
total size is 16 speedup is 0.08 (DRY RUN)

我们还可以使用它来测试我们的同步是否成功完成或比较本地和远程文件夹。

5. 同步远程目录

要同步远程目录,我们可以使用:

$ rsync -havuz dir1/ user@host:~/dir2/

我们添加了一个新标志*-z*。这意味着rsync将在传输过程中压缩数据。当我们通过网络发送文件时,我们将获得性能提升。

我们还可以使用rsync将远程文件夹同步到本地文件夹,只需更改参数顺序即可:

$ rsync -havuz user@host:~/dir2/ dir1/

** rsync的设计限制是它不能同步两个远程目录。**因此,要同步两个远程目录,我们应该考虑其他选项。我们可以先同步到本地系统,也可以先创建到远程系统之一的 ssh 连接,然后从那里进行同步。

6. 通过 SSH 同步远程目录

要将协议设置为 ssh,我们可以使用*-e*标志:

$ rsync -havuz -e ssh dir1/ user@host:~/dir2/

我们也可以使用相同的方法设置 ssh 使用的端口:

rsync -havuz -e 'ssh -p 8022' dir1/ user@host:~/dir2/

7. 同步单个文件

如果我们只想使用rsync同步单个文件,我们可以不使用尾部斜杠来指定文件名:

$ rsync -havuz dir1/text-file.txt dir2/

8. 使用其他标志

rsync还有一些我们在同步文件夹时可能会发现有用的其他标志。

8.1. 忽略现有文件

–ignore -existing标志仅同步目标目录中缺少的文件。让我们尝试一下:

$ rsync -havuz --ignore-existing dir1/ dir2/

8.2. 删除源目录中缺失的文件

我们使用*–delete*标志来进行更严格的同步。如果源目录中不存在文件,让我们使用它来删除目标目录中的文件:

$ rsync -havuz --delete dir1/ dir2/

8.3. 同步后删除源目录中的文件

如果我们正在执行诸如同步备份之类的任务,我们可能希望在源目录中的同步文件成功传输到目标后删除它们。为此,我们使用*–remove-source-files*标志:

$ rsync -havuz --remove-source-files dir1/ dir2/

8.4. 包括和排除文件

让我们使用*–include–exclude*参数来确定我们要同步哪些文件:

$ rsync -havuz --include '*.jpg' --exclude '*' dir1/ dir2/

此命令将仅包括*.jpg文件,不包括所有其他文件。

8.5. 设置要传输的文件的最大大小

让我们使用*–max-size*参数设置要包含在传输中的文件的最大大小:

$ rsync -havuz --max-size='100K' dir1/ dir2/

这在许多情况下都会很有帮助,例如,如果我们只对传输脚本和配置文件而不是大型二进制文件感兴趣。

8.6. 显示进度

对于需要较长时间才能完成的同步操作,我们可能希望在同步运行时显示进度。让我们添加一个进度指示器:

$ rsync -havuz --progress dir1/ dir2/

8.7. 使用校验和

默认情况下,rsync使用文件大小和上次修改时间来比较文件。*如果我们使用–checksum*标志,rsync将额外比较源文件和目标文件的校验和。**只有当文件的大小和最后修改时间相等时,它才会计算校验和。就数据丢失而言,这将更加安全。作为交换,它将花费额外的计算资源和少量的额外带宽。

$ rsync -havuz --checksum dir1/ dir2/