rsync是Unix下的一款应用软件,它能同步更新两处计算机的文件与目录,并适当利用差分编码以减少数据传输量。rsync中的一项同类软件不常见的重要特性是每个目标的镜像只需发送一次。rsync可以拷贝/显示目录内容,以及拷贝文件,并可选压缩以及递归拷贝。

安装

有的版本的 Linux 可能已经预装了 rsync,可以输入 rsync 测试,如果出现 rsync 相关的使用说明就可以不用再安装。如果出现 -bash: /usr/bin/rsync: No such file or directory 之类的提示,说明没有安装 rsync。

CentOS/Fedora 安装 rsync:

yum install -y rsync

Ubuntu/Debian 安装 rsync:

apt install -y rsync

安装完成后输入 rsync 可以查看选项说明。

使用

rsync 可以用于多台服务器之间同步文件,也可以在本机的不同目录之间同步文件。

下面把本机的一个文件拷贝到本机的另一个目录中:

rsync /home/hello.txt /root/hello.txt

上面把 home 目录中的 hello.txt 拷贝到了 root 目录中。rsync 的使用和 cp 命令差不多。

下面把本机 home 目录中的 hello.txt 拷贝到另一台服务器的 home 目录中:

rsync /home/hello.txt 172.93.47.76:/home/hello.txt

不同设备之间同步文件 文件路径前需要加 IP,IP 和路径之间用 : 分隔。不同设备之间同步文件需要输入密码才能同步。

下面把另一台服务器中的 home 目录下的 MWordStar.zip 拷贝到当前服务器的 home 目录下:

rsync 172.93.47.76:/home/MWordStar.zip /home/MWordStar.zip

选项说明

下面是 rsync 的一些常用选项:

选项说明
-v显示详细信息
-r:递归目录
-l同步软链接
-p保持文件权限
-t同步文件的修改时间
-g保持文件的所属组
-o保持文件的所属用户
-D保持设备文件的信息
-a多个选项集,包含了上面的 -rlptgoD
-z传输之前对文件进行压缩处理
--partial允许断点续传
--progress显示传输进度
-P允许断点续传和显示传输进度,相当于同时包含了上面的 -partial-progress
--delete在同步文件的时候删除多余的文件
--delete-after同步完成后删除多余的文件
--bwlimit限制传输速度
--include在同步多个文件或目录时可以指定需要同步的文件
--exclude在同步多个文件或目录时可以指定不需要同步的文件

下面是一些选项的详细说明:

-v

-v 选项主要就是显示详细的统计信息,如下:

rsync -v MWordStar.zip 172.93.47.76:/home/MWordStar.zip

信息统计如下:

MWordStar.zip

sent 1,198 bytes  received 1,703 bytes  341.29 bytes/sec
total size is 194,160  speedup is 66.93

-r

-r 的功能就是拷贝整个目录,包括目录下的所有文件和目录。如果不加 -r 在拷贝目录的时候会提示 skipping directory dir,也无法拷贝成功。

-l

在拷贝软链接的时候需要加 -l 选项,否则就会跳过软链接,还会提示:

skipping non-regular file xxx

其中的 xxx 就是跳过的文件名。

-P

-P 的功能就是显示传输进度和允许断点续传。下面是一个包含 -P 选项被强制中断传输的文件:

BaiduNetdisk_6.8.9.1.exe
      3,440,640   9%    1.23MB/s    0:00:25  ^CKilled by signal 2.

rsync error: unexplained error (code 255) at rsync.c(638) [sender=3.1.2]
rsync: [sender] write error: Broken pipe (32)

中断前的进度是 9%,如果接收方未完成的文件没有删除的话,下次再传这个文件还能从 9% 的地方开始传输。

--delete

--delete 的功能是在同步的时候删除多余文件,需要和 -r 选项一起使用。

下面让 home 目录和 downloads 目录同步,home 包含的文件如下:

.
|-- BaiduNetdisk_6.8.9.1.exe
`-- hello.txt

downloads 目录包含的文件如下:

.
└── GoogleDriveLogo.jpeg

使用 --delete 选项同步:

rsync -r --delete --progress /home/ 172.93.47.76:/downloads/

同步后 downloads 目录包含的文件如下:

.
├── BaiduNetdisk_6.8.9.1.exe
└── hello.txt

downloads 中包含的文件已经和 home 一样,多余的 GoogleDriveLogo.jpeg 已经被删除。

--delete-after

--delete-after 选项有点类似于 --delete ,都是删除多余的文件,不过 --delete-after 是在传输完成后才会删除多余文件,--delete 在传输之前就会删除多余文件。

使用 --delete-after 选项 如果中途传输中断了文件也不会被删除。

--bwlimit

--bwlimit 选项的功能是限制传输速度。对于服务器来说,限制传输速度可以降低传输文件时对网络的影响。

用法如下:

rsync --bwlimit=100 --progress /home/video.mp4 172.93.47.76:/downloads/video.mp4

上面的传输速度会被限制到 100k 每秒。

--include 和 --exclude

--include 的功能是指定需要同步的文件,--exclude 的功能是指定不需要同步的文件。这两个选项可以一起使用。

用法如下:

rsync -r --include 'h*' --exclude '*' /home/ 172.93.47.76:/downloads/

上面只会同步以 h 开头的文件。