Categories: Shell编程

linux rsync命令详解

Linux操作系统中,“rsync的”代表远程同步。它是一种用于将文件和目录从源 (SRC) 同步(复制)到目标 (DEST) 的实用程序。

文件和目录可以在本地主机上同步,也可以与远程主机同步。在 SRC 上,文件和目录将被同步。而在 DEST 上,将发生同步的文件和目录。

此外,rsync 命令可以递归复制文件和目录、复制符号链接、保留(权限、组、修改时间和所有权)文件身份。

Rsync 可以使用两种不同的方式来同步/复制文件或目录:

  • 使用远程 shell:ssh 或 rsh
  • 直接通过 TCP 使用 rsync 守护进程

更重要的是,rsync 使用增量传输算法,该算法仅在 SRC 和 DEST 之间复制/同步不同的数据。

本教程将通过动手实践和示例介绍使用 rsync 命令的多种方法。我们还将详细解释 rsync 命令的最常用选项。

Rsync 命令语法

在深入研究 rsync 命令的使用方法之前,让我们先来看看它的语法:

rsync [options] 

在本地机器上复制/同步文件

Rsync 命令可用于在本地机器上复制/同步文件。

假设您要将文件从名为 ‘/home/jack’ 的用户 ‘jack’ 的主目录复制到文件夹 ‘/opt/test’。

$ sudo rsync -zvh /home/jack/computer-networking.pdf /opt/test/
computer-networking.pdf

sent 1.01K bytes  received 35 bytes  2.10K bytes/sec
total size is 3.03K  speedup is 2.89

-z: 压缩

-v: 详细输出

-h: 人类可读

在本地机器上复制/同步目录

要将所有文件从 SRC 本地目录传输到 DEST 目录,请运行带有选项的 rsync 命令-zavh

假设您要将名为 ‘/home/jack’ 的用户 ‘jack’ 的主目录复制到文件夹 ‘/opt/backup’。

$ sudo rsync -zavh /home/jack/ /opt/backup/

sending incremental file list
./
.bash_history
.bash_logout
.bashrc
.lesshst
.profile
.sudo_as_admin_successful
.viminfo
computer-networking.pdf
.ssh/
.ssh/known_hosts

sent 4.85K bytes  received 198 bytes  10.10K bytes/sec
total size is 9.59K  speedup is 1.90

-a: 在复制/同步过程中存档数据

您可以验证 rsync 命令是否成功,运行以下命令:

$ ls /opt/backup/ -la
total 40
drwxr-xr-x 3 jack jack 4096 Thg 6 15 16:02 .
drwxr-xr-x 4 root     root     4096 Thg 6 15 16:25 ..
-rw------- 1 jack jack  817 Thg 6 15 16:01 .bash_history
-rw-r--r-- 1 jack jack  220 Thg 6 11 15:58 .bash_logout
-rw-r--r-- 1 jack jack 3771 Thg 6 11 15:58 .bashrc
-rw-rw-r-- 1 jack jack 3028 Thg 2 25  2017 computer-networking.pdf
-rw------- 1 jack jack   40 Thg 6 15 15:51 .lesshst
-rw-r--r-- 1 jack jack  807 Thg 6 11 15:58 .profile
drwx------ 2 jack jack 4096 Thg 6 13 17:58 .ssh
-rw-r--r-- 1 jack jack    0 Thg 6 15 16:02 .sudo_as_admin_successful
-rw------- 1 jack jack  680 Thg 6 14 16:50 .viminfo

使用特定端口通过 ssh 进行 Rsync

您可以使用 ssh(安全外壳)复制/同步数据,您的数据将通过加密的安全连接传输。当您的数据在 Internet 上传输时,没有人可以读取您的数据。当您使用 rsync 命令时,您需要提供用户/root 密码来完成特定任务。使用 SSH 选项将以加密方式发送您的登录信息,以便您的密码安全。

使用特定的 ssh 端口将文件从远程复制到本地。为了使用 rsync 命令指定协议,您需要使用-e带有要使用的协议名称的选项。

例如,以下 rsync 命令将通过远程外壳将文件“deploy.yaml”从远程机器复制到用户“jack”的主目录。

$ rsync -avz -e "ssh -p 22" cas@10.9.8.41:/home/cas/deploy.yaml /home/jack/
cas@10.9.8.41's password: 
receiving incremental file list

sent 20 bytes  received 60 bytes  32.00 bytes/sec
total size is 239  speedup is 2.99

从本地机器复制/同步文件和目录到远程机器

假设您要将本地主机中用户 ‘jack’ 的主目录中的文件夹 ‘test-data’ 复制/同步到远程机器 ‘cas@10.9.8.41’ 的主目录,请运行命令:

$ rsync -azrvh /home/jack/computer-networking.pdf cas@10.9.8.41: 
cas@10.9.8.41's password: 
sending incremental file list
computer-networking.pdf

sent 1.04K bytes  received 35 bytes  430.80 bytes/sec
total size is 3.03K  speedup is 2.81

-r: 递归复制

从远程机器复制/同步文件和目录到本地机器

rsync 命令可帮助您传输要复制到本地主机中的远程目录“文档”。

假设您要将文件/目录从远程主机“cas@10.9.8.41”复制/同步到用户“jack”的主目录。

例如:

$ rsync -zavhr cas@10.9.8.41:document /home/jack
cas@10.9.8.41's password: 
receiving incremental file list
document/
document/kubernetes.txt

sent 47 bytes  received 139 bytes  74.40 bytes/sec
total size is 0  speedup is 0.00

rsync -include 和 -exclude 选项

这两个选项允许我们通过使用这些选项指定参数来包含和排除文件,这有助于我们指定要包含在同步中的文件或目录,并排除 您不想传输的文件和文件夹。

在此示例中,rsync 命令将仅包含以 ‘k’ 开头的文件和目录,并排除所有其他文件和目录。

$ rsync -avhz -e "ssh -p 22" --include 'k*' --exclude '*' cas@10.9.8.41: /home/jack

cas@10.9.8.41's password: 
receiving incremental file list
./
k8s.yaml
kubernetes.yaml
kuber/

sent 88 bytes  received 280 bytes  147.20 bytes/sec
total size is 73  speedup is 0.20

设置最大文件大小

您可以指定要传输或同步的最大文件大小。您可以使用“–max-size”选项来完成。

在以下示例中,最大文件大小为 200k,因此此命令将仅传输等于或小于 200k 的文件。

$ rsync -zavhr --max-size='200k' cas@10.9.8.41: /home/jack
cas@10.9.8.41's password: 
receiving incremental file list
.bash_history
.bash_logout
.bashrc
.profile
.sudo_as_admin_successful
.viminfo
computer-networking.pdf

sent 2.58K bytes  received 51.60K bytes  21.67K bytes/sec
total size is 113.24K  speedup is 2.09

传输成功后删除源文件

现在,假设您有一台 Web 服务器和一台数据备份服务器,您创建了每日备份并将其与您的备份服务器同步,现在您不想在您的 Web 服务器中保留备份的本地副本。那么,您会等待传输完成然后手动删除该本地备份文件吗?当然不。这种自动删除可以使用“–remove-source-files”选项来完成。

$ ls /home/directory
computer-networking.pdf  deploy.yaml  document  k8s.yaml  kuber  kubernetes.yaml

------
$ rsync -azvh --remove-source-files /home/jack/deploy.yaml cas@10.9.8.41:
cas@10.9.8.41's password: 
sending incremental file list

sent 70 bytes  received 20 bytes  36.00 bytes/sec
total size is 239  speedup is 2.66

再次运行’ls’命令,可以看到SRC上的’deploy.yaml’文件被删除了。

$ ls
computer-networking.pdf  document  k8s.yaml  kuber  kubernetes.yaml

查找src和dest在文件和目录上的区别

为了找到 SRC 和 DEST 之间目录文件的任何差异,您可以使用 ‘-i’ 选项运行 rsync 命令。

$ rsync -avzi /home/jack/cloud cas@10.9.8.41:
cas@10.9.8.41's password: 
sending incremental file list
cd+++++++++ cloud/

限制带宽

您可以在使用 '--bwlimit=<KB/s>' 选项运行 rsync 命令时设置带宽限制。

假设要将数据传输速率限制为 300KB/s,请运行以下命令:

$ rsync -avzh --bwlimit=300 /home/jack/coursera.png cas@10.9.8.41:

cas@10.9.8.41's password: 
sending incremental file list
coursera.png

sent 2.93M bytes  received 35 bytes  234.48K bytes/sec
total size is 3.00M  speedup is 1.02

scp失败时恢复传输

有时,您必须通过 scp 命令传输一个非常大的文件,但在复制时出错,由于文件大且耗时,因此无法使用 scp 命令再次开始传输。

在这种情况下,您可以使用 rsync 命令从出现错误的位置开始复制文件。例如,将主目录中的大型 ISO 文件复制到远程主机 'cas@10.9.8.41'

$ scp /home/jack/ubuntu-18.04.4-live-server-amd64.iso cas@10.9.8.41:

cas@10.9.8.41's password: 
ubuntu-18.04.4-live-server-amd64.iso                                                                                                                                              32%  278MB  86.7MB/s   00:06 ETA

该进程已被用户杀死。当时,传输了 32% 的文件。现在,您可以通过运行 rsync 继续当前的工作:

$ rsync -P -avzh ubuntu-18.04.4-live-server-amd64.iso cas@10.9.8.41:

cas@10.9.8.41's password: 
sending incremental file list
ubuntu-18.04.4-live-server-amd64.iso
        912.26M 100%   15.89MB/s    0:00:54 (xfr#1, to-chk=0/1)

sent 541.25M bytes  received 132.44K bytes  9.25M bytes/sec
total size is 912.26M  speedup is 1.69


rsync 命令恢复传输文件

传输数据时显示进度

如果要在运行 rsync 命令时查看传输的进度,可以使用“--progress”选项。

它将显示文件和完成复制的剩余时间。

例如:

$ rsync -avh --progress /home/jack/cloud/ cas@10.9.8.41:
cas@10.9.8.41's password: 
sending incremental file list
./
computer-networking.pdf
          3.03K 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=8/10)
coursera.png
          3.00M 100%  114.38MB/s    0:00:00 (xfr#2, to-chk=7/10)
k8s.yaml
             39 100%    1.52kB/s    0:00:00 (xfr#3, to-chk=6/10)
kubernetes.yaml
             34 100%    1.33kB/s    0:00:00 (xfr#4, to-chk=5/10)
ubuntu-18.04.4-live-server-amd64.iso
        912.26M 100%   89.60MB/s    0:00:09 (xfr#5, to-chk=4/10)
document/
document/kubernetes.txt
              0 100%    0.00kB/s    0:00:00 (xfr#6, to-chk=1/10)
kuber/
kuber/test.txt
              0 100%    0.00kB/s    0:00:00 (xfr#7, to-chk=0/10)

sent 915.49M bytes  received 164 bytes  79.61M bytes/sec
total size is 915.26M  speedup is 1.00


带有进度的 rsync 命令

结论

在本教程中,我们通过一些示例学习了如何使用 rsync 命令来复制或同步文件/目录。

5.0
02
linux初学者必须掌握的90个基础命令
linux tr命令详解
嘻嘻

嘻嘻IT: 笔者是一个工作七八年的程序猿老鸟,从事涉及的技术栈主要包括PHP、Linux、Devops等,喜欢研究新技术,尝试新技术,提升技术自动化和开发效率,致力于write less,do more! 技术每年都会层出不穷,领域划分的越来越细,不可能学习所有的东西,保持对技术的好奇心,理解技术中核心思想,做一个有深度,有思想的开发!

Share
Published by
嘻嘻
Tags: linuxshell

Recent Posts

全球货币导航网页上线了!

o在全球化的今天,货币兑换和国…

20分钟 ago

bash字符串拼接

在编程中,字符串的拼接是一个非…

55分钟 ago

Bash Case详解

Bash case 语句通常用…

1小时 ago

Bash for详解

for循环是编程语言中的基础概…

1小时 ago

liunux中你必须知道alias命令?

在Linux操作系统中,无论你…

22小时 ago

zshrc文件详解

Zsh 是一个强大的 shel…

1天 ago