安装:
# Debian
$ sudo apt-get install rsync
# Red Hat
$ sudo yum install rsync
# Arch Linux
$ sudo pacman -S rsync
使用:
本机使用 rsync 命令时,可以作为 cp 和 mv 命令的替代方法,将源目录同步到目标目录。
# -r 递归,必选项
rsync -r source destination
rsync -r source1 source2 destination
-a 参数可以替代 -r ,除了可以递归同步以外,还可以同步元信息(比如修改时间、权限等)
# 目标目录如果不存在,会自动创建,把 source 完整复制到 destination 下,即 destination/source
rsync -a source destination
# 把 source 下的目录及文件同步到 destination 下,即 destination/***
rsync -a source/ destination
-n ,–dry-run
–delete,默认 rsync 只会把源目录全部复制到目标目录,不管两个目录是否相同;如果目标是作为 源的镜像,使用该参数可以保持两者目录结构相同,会删除只存在于目标目录、不存在于源目录的文件。
rsync -av --delete source/ destination
–exclude,排除,可使用正则、shell大括号,或者多个 --exclude 参数
rsync -av --exclude '*.txt' source/ destination
rsync -av --exclude='*.txt' source/ destination
rsync -av --exclude 'dir1/*' source/ destination
rsync -av --exclude 'file1.txt' --exclude 'dir1/*' source/ destination
rsync -av --exclude={'file1.txt','dir1/*'} source/ destination
也可以从文件读取要排除的文件,类似于 git ignore
rsync -av --exclude-from='exclude-file.txt' source/ destination
–include,表示必须要同步的文件,一般会和 --exclude 结合使用
远程同步:
默认情况下,使用 ssh 协议
# 本地内容同步到服务器
rsync -av source/ username@remote_host:destination
# 服务器内容同步到本地
rsync -av username@remote_host:source/ destination
如果 ssh 有额外的参数,如端口,需要使用 -e
rsync -av -e 'ssh -p 2234' source/ user@remote_host:/destination
增量备份
rsync 的最大特点就是它可以完成增量备份,也就是默认只复制有变动的文件,也能实现对比基准目录来进行备份。
# 以 compare path为基准,将 source path 与基准目录进行比较,并将变动文件复制到 target path
rsync -a --delete --link-dest /compare/path /source/path /target/path
# 使用 rsync 增量备份用户家目录
#!/bin/bash
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}
,并将 ${LATEST_LINK}
软连接指向该目录。下次备份时,将 ${LATEST_LINK}
作为基准,生成新的备份目录,最后再把软连接指向 ${LATEST_LINK}