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 ``` 那些没变动的文件则会生成硬链接 #### 实例:备份用户的主目录
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}是基准目录
';