rsync 增量同步
最后更新于:2022-04-02 03:51:52
[TOC]
> [参考](http://www.ruanyifeng.com/blog/2020/08/rsync.html)
## 概述
1.会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)
2. 替代`cp`和`mv`命令
## 安装
> 注意,传输的双方都必须安装 rsync。
## 基本用法
### -r 递归同步文件
```
rsync -r source destination
rsync -r source1 source2 destination
```
### -a [常用]递归同步文件并同步元信息
`-a`参数可以替代`-r`,除了可以递归同步以外,还可以同步元信息(比如修改时间、权限等)
```
$ rsync -a source destination
```
把 source 同步到 destination/source
```
$ rsync -a source/ destination
```
把 source 同步到 destination
### -n 模拟执行结果
```
$ rsync -anv source/ destination
-n参数模拟命令执行的结果
-v参数则是将结果输出到终端
```
### --delete 删除源中不存在的文件
`--delete`参数会使得`destination`成为`source`的一个镜像
```
$ rsync -av --delete source/ destination
```
### --exclude 排除
#### 排除文件
```
$ rsync -av --exclude='*.txt' source/ destination
# 或者
$ rsync -av --exclude '*.txt' source/ destination
```
> 注意,rsync 会同步以"点"开头的隐藏文件,如果要排除隐藏文件,可以这样写`--exclude=".*"`
#### 排除目录
排除某个目录里面的所有文件,但不排除目录本身:
```
$ rsync -av --exclude 'dir1/*' source/ destination
```
#### 多个排除模式
```
$ rsync -av --exclude 'file1.txt' --exclude 'dir1/*' source/ destination
```
#### 用文件指定排除
```
$ rsync -av --exclude-from='exclude-file.txt' source/ destination
```
每个模式一行
### 远程同步
#### 本地到远程
```
$ rsync -av source/ username@remote_host:destination
```
#### 远程到本地
```
$ rsync -av username@remote_host:source/ destination
```
> 指定ssh端口 `$ rsync -av -e 'ssh -p 2234' source/ user@remote_host:/destination
`
### 基准备份
```
rsync -a --delete --link-dest /compare/path /source/path /target/path
--link-dest参数指定基准目录/compare/path
```
那些没变动的文件则会生成硬链接
#### 实例:备份用户的主目录
> 上一次备份的目录${BACKUP_DIR}/${DATETIME}是基准目录
';
home_back.bash
``` #!/bin/bash # A script to perform incremental backups using rsync set -o errexit set -o nounset set -o pipefail readonly SOURCE_DIR="${HOME}" readonly BACKUP_DIR="/mnt/data/backups" readonly DATETIME="$(date '+%Y-%m-%d_%H:%M:%S')" readonly BACKUP_PATH="${BACKUP_DIR}/${DATETIME}" readonly LATEST_LINK="${BACKUP_DIR}/latest" mkdir -p "${BACKUP_DIR}" rsync -av --delete \ "${SOURCE_DIR}/" \ --link-dest "${LATEST_LINK}" \ --exclude=".cache" \ "${BACKUP_PATH}" rm -rf "${LATEST_LINK}" ln -s "${BACKUP_PATH}" "${LATEST_LINK}" ```> 上一次备份的目录${BACKUP_DIR}/${DATETIME}是基准目录