侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux rsync命令教程:远程数据同步的利器(附实例详解和注意事项)

Linux rsync 命令介绍

rsync(remote synchronize),用来进行远程数据同步的工具,可以实现增量备份和镜像备份。rsync 可以通过三种方式来传输文件:使用本地 shell 传输,使用远程 shell 传输,或者使用 rsync 的守护进程传输。rsync 的优点是速度快,占用资源少,支持断点续传,可以保留文件的属性和权限。

Linux rsync 命令适用的 Linux 版本

rsync 命令在大多数 Linux 发行版中都是默认安装的,如果没有安装,可以根据不同的发行版使用以下命令进行安装:

[linux@bashcommandnotfound.cn ~]$ # 基于 apt 的发行版(如 Debian、Ubuntu、Raspbian、Kali Linux 等):
[linux@bashcommandnotfound.cn ~]$ sudo apt-get install rsync

[linux@bashcommandnotfound.cn ~]$ # 基于 yum 的发行版(如 RedHat,CentOS 7 等):
[linux@bashcommandnotfound.cn ~]$ sudo yum install rsync

[linux@bashcommandnotfound.cn ~]$ # 基于 dnf 的发行版(如 Fedora,CentOS 8 等):
[linux@bashcommandnotfound.cn ~]$ sudo dnf install rsync

[linux@bashcommandnotfound.cn ~]$ # 基于 apk 的发行版(如 Alpine Linux):
[linux@bashcommandnotfound.cn ~]$ sudo apk add --update rsync

[linux@bashcommandnotfound.cn ~]$ # 基于 pacman 的发行版(如 Arch Linux):
[linux@bashcommandnotfound.cn ~]$ sudo pacman -S rsync

[linux@bashcommandnotfound.cn ~]$ # 基于 zypper 的发行版(如 openSUSE):
[linux@bashcommandnotfound.cn ~]$ sudo zypper in rsync

[linux@bashcommandnotfound.cn ~]$ # 基于 pkg 的 FreeBSD 发行版
[linux@bashcommandnotfound.cn ~]$ sudo pkg install rsync

[linux@bashcommandnotfound.cn ~]$ # 基于 pkg 的 OS X/macOS 发行版:
[linux@bashcommandnotfound.cn ~]$ brew install rsync

Linux rsync 命令的基本语法

rsync 的基本语法格式如下:

rsync [选项] [源文件或目录] [目标文件或目录]

Linux rsync 命令的常用选项或参数说明

rsync 命令有很多选项和参数,可以根据不同的需求进行组合使用。以下是一些常用的选项和参数的说明:

选项参数说明
-a--archive归档模式,相当于 -rlptgoD,即递归传输文件,并保持文件的属性、权限、时间戳、所有者、组、设备文件、符号链接等
-b--backup备份模式,即当目标文件已经存在时,会将其重命名为 ~filename,并生成一个新的文件
-c--checksum校验模式,即根据文件的校验和来判断是否需要传输,而不是根据文件的修改时间和大小
-d--dirs传输目录,但不传输符号链接
-e--rsh=COMMAND指定使用远程 shell 来传输文件,如 ssh、rsh 等
-f--filter=RULE指定一个过滤规则,用来选择要传输的文件
-h--human-readable以人类可读的方式显示文件大小,如 K、M、G 等
-i--itemize-changes显示文件的变化情况,如权限、所有者、组、大小、时间戳等
-l--links保持符号链接的指向
-n--dry-run模拟运行模式,即不实际传输文件,只显示哪些文件会被传输
-p--perms保持文件的权限
-r--recursive递归传输文件,即包括子目录中的文件
-t--times保持文件的时间戳
-u--update更新模式,即只传输源文件比目标文件新的文件
-v--verbose详细模式,即显示传输过程中的详细信息
-z--compress压缩模式,即在传输文件时进行压缩,以减少网络流量

Linux rsync 命令实例详解

以下是一些 Linux rsync 命令的实例,可以帮助您更好地理解和使用该命令。

实例1:本地文件同步

如果要将本地的一个文件或目录同步到另一个位置,可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ # 将文件 file1.txt 同步到 file2.txt
[linux@bashcommandnotfound.cn ~]$ rsync file1.txt file2.txt

[linux@bashcommandnotfound.cn ~]$ # 将目录 dir1 同步到 dir2,注意 dir2 会被创建,但不会在 dir2 中创建 dir1 子目录
[linux@bashcommandnotfound.cn ~]$ rsync -a dir1/ dir2

[linux@bashcommandnotfound.cn ~]$ # 将目录 dir1 同步到 dir2,注意 dir2 会被创建,且会在 dir2 中创建 dir1 子目录
[linux@bashcommandnotfound.cn ~]$ rsync -a dir1 dir2

实例2:远程文件同步

如果要将本地的一个文件或目录同步到远程主机上,或者从远程主机上同步一个文件或目录到本地,可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ # 将本地的文件 file1.txt 同步到远程主机 user@host 的 home 目录下
[linux@bashcommandnotfound.cn ~]$ rsync file1.txt user@host:~

[linux@bashcommandnotfound.cn ~]$ # 将本地的目录 dir1 同步到远程主机 user@host 的 home 目录下,注意会在 home 目录下创建 dir1 子目录
[linux@bashcommandnotfound.cn ~]$ rsync -a dir1 user@host:~

[linux@bashcommandnotfound.cn ~]$ # 将远程主机 user@host 的文件 file2.txt 同步到本地的 home 目录下
[linux@bashcommandnotfound.cn ~]$ rsync user@host:~/file2.txt ~

[linux@bashcommandnotfound.cn ~]$ # 将远程主机 user@host 的目录 dir2 同步到本地的 home 目录下,注意会在 home 目录下创建 dir2 子目录
[linux@bashcommandnotfound.cn ~]$ rsync -a user@host:~/dir2 ~

实例3:使用 ssh 传输文件

如果要使用 ssh 来传输文件,可以使用 -e 选项来指定 ssh 命令,这样可以提高传输的安全性,也可以使用 ssh 的一些选项,如端口、密钥等。例如:

[linux@bashcommandnotfound.cn ~]$ # 使用 ssh 传输文件,指定端口为 2222
[linux@bashcommandnotfound.cn ~]$ rsync -e "ssh -p 2222" file1.txt user@host:~

[linux@bashcommandnotfound.cn ~]$ # 使用 ssh 传输文件,指定密钥文件为 id_rsa
[linux@bashcommandnotfound.cn ~]$ rsync -e "ssh -i id_rsa" file1.txt user@host:~

[linux@bashcommandnotfound.cn ~]$ # 使用 ssh 传输文件,指定加密算法为 aes256-ctr
[linux@bashcommandnotfound.cn ~]$ rsync -e "ssh -c aes256-ctr" file1.txt user@host:~

如果要使用 ssh 传输目录,可以使用 -a 选项来保持目录的属性和权限,例如:

[linux@bashcommandnotfound.cn ~]$ # 使用 ssh 传输目录 dir1,指定端口为 2222
[linux@bashcommandnotfound.cn ~]$ rsync -a -e "ssh -p 2222" dir1 user@host:~

如果要使用 ssh 传输文件或目录时,显示传输的进度和统计信息,可以使用 -P 或 --progress 选项,例如:

[linux@bashcommandnotfound.cn ~]$ # 使用 ssh 传输文件 file1.txt,显示进度和统计信息
[linux@bashcommandnotfound.cn ~]$ rsync -P -e "ssh" file1.txt user@host:~
file1.txt
        100%  1.00kB/s    0:00:00 (xfr#1, to-chk=0/1)
sent 35 bytes  received 12 bytes  94.00 bytes/sec
total size is 1.00K  speedup is 20.31

实例4:使用 rsync 的守护进程传输文件

如果要使用 rsync 的守护进程来传输文件,可以使用 rsync:// 协议来指定远程主机的地址和模块名,模块名是在远程主机的 /etc/rsyncd.conf 文件中定义的,用来指定可以访问的目录和权限。例如:

[linux@bashcommandnotfound.cn ~]$ # 使用 rsync 的守护进程传输文件 file1.txt,指定远程主机的地址为 host,模块名为 module
[linux@bashcommandnotfound.cn ~]$ rsync file1.txt rsync://user@host/module

如果要使用 rsync 的守护进程来传输目录,可以使用 -a 选项来保持目录的属性和权限,例如:

[linux@bashcommandnotfound.cn ~]$ # 使用 rsync 的守护进程传输目录 dir1,指定远程主机的地址为 host,模块名为 module
[linux@bashcommandnotfound.cn ~]$ rsync -a dir1 rsync://user@host/module

如果要使用 rsync 的守护进程来传输文件或目录时,显示传输的进度和统计信息,可以使用 -P 或 --progress 选项,例如:

[linux@bashcommandnotfound.cn ~]$ # 使用 rsync 的守护进程传输文件 file1.txt,显示进度和统计信息
[linux@bashcommandnotfound.cn ~]$ rsync -P file1.txt rsync://user@host/module
file1.txt
        100%  1.00kB/s    0:00:00 (xfr#1, to-chk=0/1)
sent 35 bytes  received 12 bytes  94.00 bytes/sec
total size is 1.00K  speedup is 20.31

实例5:使用过滤规则选择要传输的文件

如果要在同步文件或目录时,根据一些过滤规则来选择要传输的文件,可以使用 -f 或 --filter 选项来指定一个规则,规则的格式是:

ACTION PATTERN

其中, ACTION 是一个动作符号,表示对匹配 PATTERN 的文件或目录采取的动作,常用的动作符号有:

  • + 表示包含
  • - 表示排除
  • . 表示隐藏

PATTERN 是一个匹配模式,可以使用通配符,如 *?[] 等,也可以使用斜杠 / 表示目录的结尾。

例如,如果要同步目录 dir1 到 dir2,但是排除所有以 . 开头的隐藏文件,可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ rsync -av -f '- .*' dir1/ dir2

如果要同步目录 dir1 到 dir2,但是只包含以 .txt 结尾的文件,可以使用以下命令:

[linux@bashcommandnotfound.cn ~]$ rsync -av -f '+ *.txt' -f '- *' dir1/ dir2

注意,上面的命令中,第二个规则 - * 表示排除所有文件,这是为了防止其他不匹配的文件被隐式包含,因为 rsync 的默认规则是包含所有文件。如果有多个规则,rsync 会按照顺序依次匹配,直到找到一个匹配的规则,然后执行相应的动作,如果没有找到匹配的规则,就执行默认的动作。

实例6:使用校验和判断文件是否需要更新

默认情况下,rsync 会根据文件的大小和修改时间来判断文件是否需要更新,如果这两个属性都没有变化,就认为文件没有变化,不需要传输。但是有时候,文件的内容可能发生了变化,但是大小和修改时间却没有变化,这时候就需要使用 -c 或 --checksum 选项来强制 rsync 根据文件的校验和来判断文件是否需要更新,这样可以保证文件的内容完全一致,但是会增加计算的开销。例如:

[linux@bashcommandnotfound.cn ~]$ rsync -avc source/ destination

实例7:使用备份模式避免覆盖目标文件

如果要在同步文件或目录时,避免覆盖目标位置已经存在的文件,可以使用 -b 或 --backup 选项来启用备份模式,这样 rsync 会将目标位置的文件重命名为 ~filename,并生成一个新的文件。例如:

[linux@bashcommandnotfound.cn ~]$ rsync -avb source/ destination

如果要指定备份文件的后缀名,可以使用 --suffix 选项,例如:

[linux@bashcommandnotfound.cn ~]$ rsync -avb --suffix=.bak source/ destination

如果要指定备份文件的存放位置,可以使用 --backup-dir 选项,例如:

[linux@bashcommandnotfound.cn ~]$ rsync -avb --backup-dir=backup source/ destination

实例8:使用模拟运行模式检查命令的效果

如果要在执行 rsync 命令之前,检查命令的效果,可以使用 -n 或 --dry-run 选项来启用模拟运行模式,这样 rsync 只会显示哪些文件会被传输,而不会真的传输文件。这样可以避免一些不必要的错误或数据丢失。例如:

[linux@bashcommandnotfound.cn ~]$ rsync -avn source/ destination

实例9:使用详细模式显示传输过程的信息

如果要在执行 rsync 命令时,显示传输过程中的一些信息,如文件名、大小、速度、进度等,可以使用 -v 或 --verbose 选项来启用详细模式,这样 rsync 会在终端输出一些有用的信息。例如:

[linux@bashcommandnotfound.cn ~]$ rsync -av source/ destination
sending incremental file list
./
file1.txt
file2.txt

sent 35 bytes  received 12 bytes  94.00 bytes/sec
total size is 1.00K  speedup is 20.31

如果要显示更详细的信息,可以使用 -i 或 --itemize-changes 选项,这样 rsync 会在每个文件名前面显示一个字母代码,表示文件的变化情况,如权限、所有者、组、大小、时间戳等。例如:

[linux@bashcommandnotfound.cn ~]$ rsync -avi source/ destination
sending incremental file list
.d..t...... ./
>f+++++++++ file1.txt
>f.st...... file2.txt

sent 35 bytes  received 12 bytes  94.00 bytes/sec
total size is 1.00K  speedup is 20.31

上面的输出中,每个字母代码的含义如下:

  • . 表示没有变化
  • < 表示文件被传输到远程主机(发送)
  • > 表示文件被传输到本地主机(接收)
  • c 表示文件的内容发生了变化
  • h 表示文件是硬链接
  • . 表示文件不是目录(即普通文件)
  • d 表示文件是目录
  • L 表示文件是符号链接
  • s 表示文件的大小发生了变化
  • t 表示文件的时间戳发生了变化
  • p 表示文件的权限发生了变化
  • o 表示文件的所有者发生了变化
  • g 表示文件的组发生了变化
  • + 表示文件是新增的
  • * 表示文件是被修改的

实例10:使用压缩模式减少网络流量

如果要在传输文件时,减少网络流量,可以使用 -z 或 --compress 选项来启用压缩模式,这样 rsync 会在传输文件时进行压缩,以减少数据量,但是会增加 CPU 的开销。例如:

[linux@bashcommandnotfound.cn ~]$ rsync -avz source/ destination

实例11:使用进度模式显示传输的进度和统计信息

如果要在传输文件时,显示传输的进度和统计信息,可以使用 -P 或 --progress 选项来启用进度模式,这样 rsync 会在终端输出每个文件的传输进度和速度,以及总体的传输统计信息。例如:

[linux@bashcommandnotfound.cn ~]$ rsync -avP source/ destination
sending incremental file list
./
file1.txt
        100%  1.00kB/s    0:00:00 (xfr#1, to-chk=0/1)
file2.txt
        100%  1.00kB/s    0:00:00 (xfr#2, to-chk=0/1)

sent 35 bytes  received 12 bytes  94.00 bytes/sec
total size is 1.00K  speedup is 20.31

Linux rsync 命令的注意事项

使用 rsync 命令时,有以下几点需要注意:

  • 如果要同步目录,要注意目录名后面是否有斜杠 /,有斜杠表示同步目录下的内容,没有斜杠表示同步整个目录。
  • 如果要同步文件或目录时,排除一些不需要的文件或目录,可以使用 --exclude 选项来指定一个模式,或者使用 --exclude-from 选项来指定一个包含多个模式的文件。
  • 如果要同步文件或目录时,只包含一些需要的文件或目录,可以使用 --include 选项来指定一个模式,或者使用 --include-from 选项来指定一个包含多个模式的文件。
  • 如果要同步文件或目录时,删除目标位置中多余的文件或目录,可以使用 --delete 选项,这样可以保持源和目标的一致性,但要谨慎使用,以免造成数据丢失。
  • 如果在执行 rsync 命令时,出现 bash: rsync: command not found 的错误,说明 rsync 命令没有安装,可以按照上面的方法进行安装,这里不再重复。
0

评论区