shell 命令学习: rsync

rsync 用法教程
更新于: 2022-08-25 12:58:12

简介

rsync 是一个常用的 Linux 应用程序,用于文件同步。

可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件(但不支持两台远程计算机之间的同步)。它也可以当作文件复制工具,替代 cpmv 命令。

英文

r-sync: remote sync

与 ftp 不同

与其他文件传输工具(如 FTP 或 scp)不同,rsync 的最大特点是会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)

安装

mac系统自带的,所以,暂时没有测试过安装的过程。

# Debian
$ sudo apt-get install rsync

# Red Hat
$ sudo yum install rsync

# Arch Linux
$ sudo pacman -S rsync

CheatSheet

功能代码
-r 参数
# -r表示递归,即包含子目录。
# 注意,-r是必须的,否则 rsync 运行不会成功。
# source目录表示源目录,destination表示目标目录。
rsync -r source destination
多个文件或目录需要同步
# source1、source2 都会被同步到 destination
rsync -r source1 source2 destination
-a 参数
# -a参数可以替代-r,除了可以递归同步以外,还可以同步元信息
rsync -a source destination
# 同步内容
rsync -a source/ destination
-n 参数
# 如果不确定 rsync 执行后会产生什么结果
# 可以先用-n或--dry-run参数模拟执行的结果。
rsync -anv source/ destination
--delete 参数
# 删除只存在于目标目录、不存在于源目录的文件。
rsync -av --delete source/ destination
--exclude 参数
# 我们希望同步时排除某些文件或目录
rsync -av --exclude='*.txt' source/ destination
# 或者
rsync -av --exclude '*.txt' source/ destination
# 多个排除模式也可以利用 Bash 的大扩号的扩展功能,只用一个--exclude参数。
rsync -av --exclude={'file1.txt','dir1/*'} source/ destination
排除特别多,可以用文件
# 如果排除模式很多,可以将它们写入一个文件
# 每个模式一行,然后用--exclude-from参数指定这个文件
rsync -av --exclude-from='exclude-file.txt' source/ destination
--include 参数
# --include参数用来指定必须同步的文件模式,往往与--exclude结合使用。
# 上面命令指定同步时,排除所有文件,但是会包括 TXT 文件
rsync -av --include="*.txt" --exclude='*' source/ destination
同步: local → remote
# 它可以将本地内容,同步到远程服务器
rsync -av source/ username@remote_host:destination
同步: remote → local
# 也可以将远程内容同步到本地
rsync -av username@remote_host:source/ destination

增量备份

rsync 的最大特点就是它可以完成增量备份,也就是默认只复制有变动的文件。

除了源目录与目标目录直接比较,rsync 还支持使用基准目录,即将源目录与基准目录之间变动的部分,同步到目标目录。

具体做法是,第一次同步是全量备份,所有文件在基准目录里面同步一份。以后每一次同步都是增量备份,只同步源目录与基准目录之间有变动的部分,将这部分保存在一个新的目标目录。这个新的目标目录之中,也是包含所有文件,但实际上,只有那些变动过的文件是存在于该目录,其他没有变动的文件都是指向基准目录文件的硬链接。

$ rsync -a --delete --link-dest /compare/path /source/path /target/path

下面是一个脚本示例,备份用户的主目录。

#!/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}"

参考