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 命令没有安装,可以按照上面的方法进行安装,这里不再重复。
评论区