1. 概述

rsync 是 Remote Sync 的缩写,即远程同步的意思。rsync 是一个用于传输和同步文件和文件夹的实用命令行工具。

本教程我们将学习如何使用 rsync 在两台电脑之间复制文件。

2. rsync 的优势

作为文件复制工具,rsync 具有许多优点:

  • 支持复制链接、设备、所有者和用户组、以及访问权限
  • 通过 –exclude 和 –exclude-from 选项,允许我们排除某些文件
  • 可以通过 SSH 进行安全传输
  • 可仅传输新的或修改过的文件,以最大限度地减少需要传输的数据量
  • 在发送和接收数据时会压缩数据。因此,我们可以使用它来发送更大的文件

了解完 rsync 的优势后,下面我们学习如何安装 rsync。

3. 安装 rsync

大多数 Linux 发行版都预装了 rsync,无需安装。但如果你不小心删除了,我们可以重新安装它:

# Debian 安装方式

$ sudo apt update
$ sudo apt install rsync

# Fedora 上安装

$ sudo dnf install rsync

# CentOS 及 RedHat 上安装

$ sudo yum install rsync

# openSUSE 安装

$ sudo zypper install rsync

# Arch Linux 上安装

$ pacman -S rsync

使用下面命令,验证 rsync 是否安装成功:

$ rsync --version
rsync  version 3.1.3  protocol version 31
Copyright (C) 1996-2018 by Andrew Tridgell, Wayne Davison, and others.

我们已经成功安装 rsync。下面学习如何使用

4. 拷贝文件和文件夹

rsync 命令用法如下:

$ rsync [options] [source files and directories] [destination]

下面具体演示

4.1. 复制文件

最简单的,复制本地文件到远程系统:

rsync -a /home/user/Downloads/file.txt root@5.182.18.49:/home/Files
root@5.182.18.49's password: 

其中:

  • -a 表示存档模式(archive mode)。它会递归复制(同步文件夹时),并保留几乎所有的内容如符号链接、权限、修改时间、用户组、所有权、设备文件等
  • file.txt 是我们要复制的文件
  • /home/Files 是我们要保存的远程路径

运行命令后,会要求我们输入远程主机的 SSH 密码,然后开始复制。

4.2. 复制文件夹

复制本地文件夹到远程:

rsync -a /home/user/Downloads/Temp root@5.182.18.49:/home/Files
root@5.182.18.49's password: 

4.3. 复制文件夹下的内容

仅复制文件夹下的内容,而不包括文件夹本身:

rsync -a /home/user/Downloads/Temp/ root@5.182.18.49:/home/Files

上面命令会复制 Temp 下的所有文件和文件夹到远程的/home/Files目录下。

注意Temp后面有个斜杠,表示仅复制文件夹下的内容,不复制自身。

4.4. 排除文件

使用 –exclude 和 –exclude-from 选项可排除不需要同步的文件名。

–exclude 接收单个匹配模式(patten),而 —exclude-from 支持从配置文件中读取多个匹配模式(patten)。

示例:

ls
file1.txt  file2.txt  file3.txt  new_file.pdf
rsync -a --exclude="*.txt" /home/user/Downloads/Temp/ root@5.182.18.49:/home/Files
root@5.182.18.49's password: 

这将排除 Temp 目录中的所有txt文件。因此,只会复制 new_file.pdf。

再看另一个例子:

$ ls
$ exclude_patterns.txt  file1.txt  file2.txt  file3.txt  new_file.pdf  picture.jpg
$ cat exclude_patterns.txt 
$ *.txt
$ *.pdf
$ rsync -a --exclude-from="exclude_patterns.txt" /home/user/Downloads/Temp/ root@5.182.18.49:/home/Files/Temp
$ root@5.182.18.49's password:  

这次,我们有多个模式(.txt和.pdf)需要 rsync 排除。因此,我们将它们写入名为 exclude_patterns.txt 的文件中,并通过 –exclude-from 参数指定。

命令运行后,只有 picture.png 会被复制到远程主机上。

4.5. 发送大文件

在传输大量数据时,我们可以添加 -P 选项(它是--progress和--partial的结合),这样rsync 在传输过程中会显示进度,并且保留部分传输的文件 (rsync默认会删除只传了一半的文件,加上这个参数告诉后rsync不要删,下次恢复后继续传):

$ ls
file1.txt  file2.txt  file3.txt  new_file.pdf  picture.jpg  video.mkv
$ rsync -a -P /home/user/Downloads/Temp/ root@5.182.18.49:/home/Files/Temp
root@5.182.18.4’s password: 
sending incremental file list
./
file1.txt
              0 100%    0.00kB/s    0:00:00 (xfr#2, to-chk=5/8)
file2.txt
              0 100%    0.00kB/s    0:00:00 (xfr#3, to-chk=4/8)
file3.txt
              0 100%    0.00kB/s    0:00:00 (xfr#4, to-chk=3/8)
new_file.pdf
              0 100%    0.00kB/s    0:00:00 (xfr#5, to-chk=2/8)
picture.jpg
              0 100%    0.00kB/s    0:00:00 (xfr#6, to-chk=1/8)
video.mkv
    245,379,066 100%  570.99kB/s    0:06:59 (xfr#7, to-chk=0/8)

5. 总结

本文我们学习了在不同场景中使用 rsync 的几个示例。rsync 跨网同步文件和文件夹同步上提供了许多优势。