Linux中rsync(远程同步)命令详解示例

meShell · 2019-11-22

安装

  • Install rsync on CentOS & RHEL
yum install rsync -y
  • Install rsync on Ubuntu & Linux Mint
apt install rsync -y

命令语法

  • 本地同步
[root@meshell]# rsync <options> <source> <Destination>
  • 远程同步到本地
[root@meshell]# rsync <options>  <UserName>@<Remote-Host>:<Source-File-Dir> <Destination>
  • 本地文件远程同步
[root@meshell]# rsync <options> <Source-File-Dir> <UserName>@<Remote-Host>:<Destination>

下面列出了rsync命令中的一些常用选项:

  • -v, –verbose 详细输出
  • -q, –quiet 禁止输出消息
  • -a, –archive 同步归档文件和目录(-a等于以下选项-rlptgoD)
  • -r, –recursive 递归同步文件和目录
  • -b, –backup 在同步期间进行备份
  • -u, –update 如果目标文件较新,不将文件从源复制到目标
  • -l, –links 在同步期间将符号链接复制为符号链接
  • -n, –dry-run 进行不同步的试运行
  • -e, –rsh=COMMAND 要在rsync中使用的远程shell指令
  • -z, –compress 传输过程中压缩文件数据
  • -h, –human-readable 以人类可读的格式显示输出数字
  • –progress 显示传输过程中的同步进度

下面就是rsync命令的一些示例:

在本地复制或同步文件

假设我们想将文件从meshell用户的主目录复制文件到/opt/back文件夹,执行以下rsync命令


[root@gateway ~]# rsync -zvh /home/meshell/OpenStack-Networking.pdf /opt/backup
OpenStack-Networking.pdf
sent 4.09M bytes  received 35 bytes  2.73M bytes/sec
total size is 6.15M  speedup is 1.50
[root@gateway ~]#

在上面,我们使用了-z进行压缩,-v进行详细输出和-h进行人类可读输出的选项

在本地复制或同步目录

假设我们想将meshell用户的主目录复制或同步到/opt/backup文件夹,执行以下带有选项-zavh的rsync命令.

[root@meshell ~]# rsync -zavh /home/meshell /opt/backup
sending incremental file list
meshell/
meshell/.bash_logout
meshell/.bash_profile
meshell/.bashrc
meshell/OpenStack-Networking.pdf

sent 4.09M bytes  received 96 bytes  8.19M bytes/sec
total size is 6.15M  speedup is 1.50
[root@meshell ~]#

让我们验证是否复制目录,执行以下命令.

[root@meshell ~]# ls -ld /opt/backup/*
-rwx------. 1 root   root   6153239 Apr  7 00:25 /opt/backup/OpenStack-Networking.pdf
[root@meshell ~]#

在本地递归复制文件和目录

假设我们在meshell用户主目录中有多个文件和目录,请使用以下rsync命令以递归方式复制文件和目录,或者使用-a或-r选项以递归方式复制文件和目录。

在rsync命令中-a选项用于在复制或同步期间进行归档,并且除了归档以外-a选项还用于以下操作:

  • 递归复制文件和目录
  • 将符号链接复制为符号链接
  • 保留权限
  • 保存组
  • 保留修改时间
  • 保留所有权
[root@meshell ~]# rsync -zrvh /home/meshell /opt/backup
或者
[root@meshell ~]# rsync -zavh /home/meshell /opt/backup

将文件和目录从本地复制或同步到远程系统

假设我们要将文件夹/home/meshell/techi从本地计算机复制到远程计算机(192.168.1.29)下的/opt目录.

[root@meshell ~]# rsync -zarvh /home/meshell/techi root@192.168.1.29:/opt
root@192.168.1.29's password:
…………………………………………………………
techi/OTRS/
techi/OTRS/Database-Selection-OTRS-Installation-CentOS7.jpg
techi/OTRS/Install-OTRS-Accept-License.png
techi/OTRS/Install-OTRS-CentOS7-RHEL7.jpg
techi/OTRS/mysql-secure-installation-centos7-part2.jpg

sent 34.85M bytes  received 2.65K bytes  6.34M bytes/sec
total size is 37.77M  speedup is 1.08
……………………………………………………………
[root@meshell ~]#

将文件和目录从远程计算机复制或同步到本地系统

假设我们想将文件和目录从远程计算机(192.168.1.29)复制到我们的本地系统,在下面的示例中,我正在远程文件夹/opt/rpms_db复制到本地计算机/tmp文件夹下.

[root@meshell ~]# rsync -zarvh root@192.168.1.29:/opt/rpms_db /tmp
root@192.168.1.29's password:
receiving incremental file list
……………………………………………………………
rpms_db/
rpms_db/httpd-2.4.6-88.el7.centos.x86_64.rpm
rpms_db/httpd-tools-2.4.6-88.el7.centos.x86_64.rpm
rpms_db/postfix-2.10.1-7.el7.x86_64.rpm
rpms_db/pytalloc-2.1.13-1.el7.x86_64.rpm
rpms_db/samba-4.8.3-4.el7.x86_64.rpm
rpms_db/samba-client-libs-4.8.3-4.el7.x86_64.rpm
rpms_db/samba-common-4.8.3-4.el7.noarch.rpm
rpms_db/samba-common-libs-4.8.3-4.el7.x86_64.rpm
rpms_db/samba-common-tools-4.8.3-4.el7.x86_64.rpm
rpms_db/samba-libs-4.8.3-4.el7.x86_64.rpm

sent 484 bytes  received 15.45M bytes  1.07M bytes/sec
total size is 16.37M  speedup is 1.06
[root@meshell ~]#

上面的命令将在我们本地计算机的/tmp文件夹下自动创建一个文件夹”rpms_db”。

[root@meshell ~]# ls -l /tmp/
total 8
-rwx------. 1 root root  827 Apr  6 12:54 ks-script-avmuxw
drwxr-xr-x. 2 root root 4096 Apr  7 01:42 rpms_db
-rw-------. 1 root root    0 Apr  6 12:35 yum.log
[root@meshell ~]# ls -l /tmp/rpms_db/
total 16028
……………………………………
-rw-r--r--. 1 root root 2844028 Nov 12 09:28 httpd-2.4.6-88.el7.centos.x86_64.rpm
-rw-r--r--. 1 root root   92504 Nov 12 09:28 httpd-tools-2.4.6-88.el7.centos.x86_64.rpm
-rw-r--r--. 1 root root 2558136 Nov 12 09:44 postfix-2.10.1-7.el7.x86_64.rpm
-rw-r--r--. 1 root root   17404 Nov 12 09:44 pytalloc-2.1.13-1.el7.x86_64.rpm
-rw-r--r--. 1 root root  696472 Nov 12 09:46 samba-4.8.3-4.el7.x86_64.rpm
-rw-r--r--. 1 root root 5070800 Nov 12 09:46 samba-client-libs-4.8.3-4.el7.x86_64.rpm
-rw-r--r--. 1 root root  210984 Nov 12 10:19 samba-common-4.8.3-4.el7.noarch.rpm
-rw-r--r--. 1 root root  167512 Nov 12 09:46 samba-common-libs-4.8.3-4.el7.x86_64.rpm
-rw-r--r--. 1 root root  458380 Nov 12 09:46 samba-common-tools-4.8.3-4.el7.x86_64.rpm
-rw-r--r--. 1 root root  282332 Nov 12 09:46 samba-libs-4.8.3-4.el7.x86_64.rpm
……………………………………
[root@meshell ~]#

在同步期间指定远程ssh

在rsync命令中,我们可以在同步过程中指定像ssh这样的远程shell,假设我们想通过rsync在源到目标计算机之间使用安全通信,那么我们应该将ssh用作远程shell,示例如下所示.

[root@meshell ~]# rsync -zarvh -e ssh  root@192.168.1.29:/opt/rpms_db  /tmp
root@192.168.1.29's password:
receiving incremental file list
………………………………………………………………………………
rpms_db/
rpms_db/httpd-2.4.6-88.el7.centos.x86_64.rpm
rpms_db/httpd-tools-2.4.6-88.el7.centos.x86_64.rpm
rpms_db/postfix-2.10.1-7.el7.x86_64.rpm
rpms_db/pytalloc-2.1.13-1.el7.x86_64.rpm
rpms_db/samba-4.8.3-4.el7.x86_64.rpm
rpms_db/samba-client-libs-4.8.3-4.el7.x86_64.rpm
rpms_db/samba-common-4.8.3-4.el7.noarch.rpm
rpms_db/samba-common-libs-4.8.3-4.el7.x86_64.rpm
rpms_db/samba-common-tools-4.8.3-4.el7.x86_64.rpm
rpms_db/samba-libs-4.8.3-4.el7.x86_64.rpm

sent 484 bytes  received 15.45M bytes  1.82M bytes/sec
total size is 16.37M  speedup is 1.06
[root@meshell ~]#

在rsync命令输出中显示同步进度

如果要在rsync命令中查看同步或复制进度,请使用“ –progress”,示例如下.

[root@meshell ~]# rsync -avh --progress root@192.168.1.29:/opt/rpms_db /tmp
root@192.168.1.29's password:
receiving incremental file list
……………………………………………………………………………………………………..
rpms_db/
rpms_db/httpd-2.4.6-88.el7.centos.x86_64.rpm
          2.84M 100%   35.22MB/s    0:00:00 (xfr#6, to-chk=18/25)
rpms_db/httpd-tools-2.4.6-88.el7.centos.x86_64.rpm
         92.50K 100%    1.13MB/s    0:00:00 (xfr#7, to-chk=17/25)
rpms_db/postfix-2.10.1-7.el7.x86_64.rpm
          2.56M 100%   14.44MB/s    0:00:00 (xfr#17, to-chk=7/25)
rpms_db/samba-4.8.3-4.el7.x86_64.rpm
        696.47K 100%    3.71MB/s    0:00:00 (xfr#19, to-chk=5/25)
rpms_db/samba-client-libs-4.8.3-4.el7.x86_64.rpm
          5.07M 100%   19.90MB/s    0:00:00 (xfr#20, to-chk=4/25)
rpms_db/samba-common-4.8.3-4.el7.noarch.rpm
        210.98K 100%  844.42kB/s    0:00:00 (xfr#21, to-chk=3/25)
rpms_db/samba-common-libs-4.8.3-4.el7.x86_64.rpm
        167.51K 100%  667.70kB/s    0:00:00 (xfr#22, to-chk=2/25)
rpms_db/samba-common-tools-4.8.3-4.el7.x86_64.rpm
        458.38K 100%    1.77MB/s    0:00:00 (xfr#23, to-chk=1/25)
rpms_db/samba-libs-4.8.3-4.el7.x86_64.rpm
        282.33K 100%    1.09MB/s    0:00:00 (xfr#24, to-chk=0/25)

sent 484 bytes  received 16.38M bytes  3.64M bytes/sec
total size is 16.37M  speedup is 1.00
[root@meshell ~]#

复制目录结构而不复制文件

在某些情况下,我们只希望将跳过文件的目录结构从本地计算机复制到远程,反之亦然。 假设我们要将”/home/meshell”的目录结构从本地计算机复制到/opt文件夹下的远程计算机(192.168.1.29).

root@meshell ~]# rsync -av -f"+ */" -f"- *" /home/meshell root@192.168.1.29:/opt/
root@192.168.1.29's password:
building file list ... done
………………………………………………
meshell/

sent 43 bytes  received 19 bytes  17.71 bytes/sec
total size is 0  speedup is 0.00
[root@meshell ~]#

scp失败后恢复大文件传输

在linux管理员配置文件中,有些情况下我们已经开始使用scp命令复制较大的文件,但是该文件在中间终止,由于它的大小和时间消耗,我们无法使用scp重新开始复制​​它。

因此,在这种情况下,可以使用rsync命令,因为它可以从中断或终止的位置开始复制文件,换句话说,rsync可以传输使用scp命令部分复制的文件。示例如下所示.

[root@meshell ~]# scp root@192.168.1.29:/root/ubuntu-18.04-desktop-amd64.iso /opt
root@192.168.1.29's password:
ubuntu-18.04-desktop-amd64.iso                   28%  526MB  61.5MB/s   00:21 ETA
^CKilled by signal 2.
[root@meshell ~]#
[root@meshell ~]# rsync -P --rsh=ssh root@192.168.1.29:/root/ubuntu-18.04-desktop-amd64.iso /opt
root@192.168.1.29's password:
ubuntu-18.04-desktop-amd64.iso
  1,921,843,200 100%   18.47MB/s    0:01:39 (xfr#1, to-chk=0/1)
[root@meshell ~]#

如果源中不存在目标文件,删除该文件

如果已经将文件从源同步到目标,并且已经从源删除了文件,则可以使用–delete选项强制rsync命令删除目标上的文件,示例如下所示.

[root@meshell ~]# rsync -avz --delete /opt/rpms_db root@192.168.1.28:/tmp/rpms_db
root@192.168.1.28's password:
sending incremental file list
deleting rpms_db/apr-util-1.5.2-6.el7.x86_64.rpm
deleting rpms_db/apr-1.4.8-3.el7_4.1.x86_64.rpm
rpms_db/

sent 862 bytes  received 105 bytes  276.29 bytes/sec
total size is 15,947,152  speedup is 16,491.37
[root@meshell ~]#

限制文件传输大小

如果您不想使用rsync传输或复制大文件,则使用选项’–max-size = {specify-size-here}’,假设我们不希望传输其文件大小超过500K, 注意:要指定大小(以MB为单位),请使用M;对于GB,请使用G。

[root@meshell ~]# rsync -avz --max-size='500K' /opt/rpms_db root@192.168.1.28:/tmp

不要在目标位置同步/复制已修改的文件

在某些情况下,我们在目标位置修改了文件,并且不想在同步时从源覆盖已修改的文件,因此可以使用rsync命令中的-u选项轻松实现.

[root@meshell ~]# rsync -avzu root@192.168.1.29:/opt/techi /home/meshell/techi
root@192.168.1.29's password:
receiving incremental file list

sent 37 bytes  received 4,960 bytes  1,427.71 bytes/sec
total size is 37,771,649  speedup is 7,558.87
[root@meshell ~]#

同步后从源中删除文件

假设您想在使用rsync命令完成同步后从源中删除文件。在下面的示例中,本地系统”/home/meshell/techi.tgz”中的文件夹已同步到远程系统(192.168.1.29),一旦同步完成,它将从源中删除文件。

[root@meshell ~]# rsync --remove-source-files -zvh /home/meshell/techi.tgz root@192.168.1.29:/opt
root@192.168.1.29's password:
techi.tgz
sent 597 bytes  received 43 bytes  182.86 bytes/sec
total size is 518  speedup is 0.81
[root@meshell ~]#
[root@meshell ~]# ls -l /home/meshell/techi.tgz
ls: cannot access /home/meshell/techi.tgz: No such file or directory
[root@meshell ~]#

在实际同步之前测试运行rsync命令

在某些情况下,我们与rsync命令的行为无关,因此在这种情况下最好进行rsync的空运行.

[root@meshell ~]# rsync --dry-run --remove-source-files -zvh /home/meshell/projects.tar  root@192.168.1.29:/opt
root@192.168.1.29's password:
projects.tar

sent 51 bytes  received 19 bytes  7.37 bytes/sec
total size is 981.24M  speedup is 14,017,682.29 (DRY RUN)
[root@meshell ~]#

与rsync同步期间包含和排除文件

在某些情况下,我们要复制或同步特定类型的文件和目录,并希望排除特定类型的文件或目录。 rsync命令支持包含和排除选项。 在下面的示例中,要复制pdf和rpm类型的文件,并排除png文件类型。

[root@meshell ~]# rsync -avz -e ssh --include '*.pdf *.rpm' --exclude '*.png' /home/meshell/techi root@192.168.1.29:/opt
root@192.168.1.29's password:
sending incremental file list
techi/
techi/OpenStack-Networking.pdf
techi/httpd-2.4.6-88.el7.centos.x86_64.rpm
techi/httpd-tools-2.4.6-88.el7.centos.x86_64.rpm
techi/postfix-2.10.1-7.el7.x86_64.rpm

sent 9,469,912 bytes  received 96 bytes  2,705,716.57 bytes/sec
total size is 11,647,907  speedup is 1.23
[root@meshell ~]#

在rsync中限制数据传输速度

在rsync命令中,我们可以设置从一台计算机到另一台计算机的数据传输的带宽限制,请在rsync命令中使用”–bwlimit =


[root@meshell ~]# rsync -avz --progress --bwlimit=600 /home/meshell/techi root@192.168.1.29:/opt
root@192.168.1.29's password:
sending incremental file list
techi/
techi/OpenStack-Networking.pdf
6,153,239 100%  910.02kB/s    0:00:06 (xfr#1, to-chk=6/8)
techi/httpd-2.4.6-88.el7.centos.x86_64.rpm
2,844,028 100%  615.28kB/s    0:00:04 (xfr#2, to-chk=5/8)
techi/httpd-tools-2.4.6-88.el7.centos.x86_64.rpm
92,504 100%  507.51kB/s    0:00:00 (xfr#3, to-chk=4/8)
techi/pkumar-2.png
0 100%    0.00kB/s    0:00:00 (xfr#4, to-chk=3/8)
techi/pkumar-3.png
0 100%    0.00kB/s    0:00:00 (xfr#5, to-chk=2/8)
techi/pkumar.png
0 100%    0.00kB/s    0:00:00 (xfr#6, to-chk=1/8)
techi/postfix-2.10.1-7.el7.x86_64.rpm
2,558,136 100%  594.80kB/s    0:00:04 (xfr#7, to-chk=0/8)

sent 9,470,087 bytes  received 153 bytes  485,653.33 bytes/sec
total size is 11,647,907  speedup is 1.23
[root@meshell ~]#

查看源和目标之间文件和目录的差异

在rsync命令中使用”-i”选项列出源和目标之间文件和目录的差异。示例如下所示

[root@meshell ~]# rsync -avzi /home/meshell/techi root@192.168.1.29:/opt
root@192.168.1.29's password:
sending incremental file list
.d..t...... techi/
<f.st...... techi/projects.txt

sent 438 bytes  received 45 bytes  138.00 bytes/sec
total size is 11,648,064  speedup is 24,116.07
[root@meshell ~]#

根据以上命令输出,目标上名为”projects.txt”的文件存在差异。以下是上述输出中关键字的含义,

  • d:指示目标文件的更改
  • f:表示文件
  • t:表示时间戳更改
  • s:表示尺寸变化

以上就是rsync命令的基本用法。