Skip to main content

rsync

tip

数据量大,有条件的情况下,尽量用 rclone,支持并发。

tip
  • rsync 不支持检测 rename, --fuzzy 能对名字做模糊匹配
    • rclone 支持基于 hash, modtime, leaf 检测 rename
  • rsync 不支持并行 - rclone 支持并行
  • 更复杂的同步场景推荐 rclone
  • 更复杂的备份场景推荐 restic
  • 同步的属性
    • times
    • owner
      • 备份、跨系统同步需要忽略 owners
    • group
    • perms
  • 同步文件的类型
    • links
    • devices
flagsfor
--archive, -a-rlptgoD
--recursive, -r
--links, -l
--perms, -p
--times, -t
--owner, -o
--group, -g
-D--devices --specials
--verbose, -v
--progress显示传输进度
--partial保留部分传输文件
-P--partial --progress
--stats
--remove-source-files同步后删除源文件
--human-readable, -h
--checksum,-c
--prune-empty-dirs,-m删除空目录
--existing只同步已经有的
--ignore-existing只同步新的
--updateskip files that are newer on the receiver
--mkpath创建目录

Note

  • rsync src dst -> rsync src/ dst/src - src 含 / 表示不创建目录
  • dst 如果包含 / 则不存在时会创建目录,否则会被复制为指定文件
# 使用 SSH 同步
rsync -avz -e ssh remoteuser@remotehost:/remote/dir /this/dir/

# 远程使用 sudo
rsync --rsync-path="sudo rsync" -avz dnsmasq/ admin@10.1.1.1:/etc/dnsmasq/

# 备份整个系统
rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /path/to/backup/folder
# 使用 --info=progress2 显示总体的进度, 而不是每个文件
rsync -aAX --info=progress2 --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /path/to/backup/folder

# 不同步权限用户分组信息
rsync -avz --no-perms --no-owner --no-group mnt/wener abuild/

# 配合 fswatch 使用
# 拷贝
fswatch ./ | xargs -I{} cp {} ~/Dropbox/backup/latest/
# rsync
alias run_rsync='rsync -azP --exclude ".*/" --exclude ".*" --exclude "tmp/" ~/Documents/repos/my_repository username@host:~'
run_rsync
fswatch -o . | while read f; do run_rsync; done

并行

rsync -avzm --stats --safe-links --ignore-existing --dry-run \
--human-readable /data/projects REMOTE-HOST:/data/ > /tmp/transfer.log

# --relative 要求在 /data/projects 执行
cat /tmp/transfer.log \
| parallel --will-cite -j 5 rsync -avzm --relative \
--stats --safe-links --ignore-existing \
--human-readable {} REMOTE-HOST:/data/ > result.log

filter by extension

  • --prune-empty-dirs
    • 3.1.2 -m
# 3.0.6+
rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to"
# < 3.0.6
rsync -zarv --include="*/" --exclude="*" --include="*.sh" "$from" "$to"

Filter Rules

  • exclude, -
  • include, +
  • merge, .
  • dir-merge, :
  • hide, H
  • show, S
  • protect, P
  • risk, R
  • clear, !
  • Modifier
    • / - 绝对路径
    • !
    • C - CVS-exclude
    • s - sending side
    • r - receiving side
    • p - perishable
    • x - xattr

FAQ

ssh port

rsync -e 'ssh -p 2222'

zstd

  • --compress-choice=zstd --compress-level=3 --checksum-choice=xxh3
rsync -avP --compress-choice=zstd --compress-level=3 --checksum-choice=xxh3 ./data/ wen-svr:/data/

change_dir "/" (in f) failed: Permission denied (13)

receiver mkstemp "/.file.tar.gz.XXXXXX" (in backup) failed: Permission denied (13)

generator failed to set permissions on "/file.tar.gz" (in backup): No such file or directory (2)

  • 说明: rsync 无法在目标目录创建临时文件
  • 原因:
    • 可能是目标目录权限问题
    • 可能是目标目录不存在
  • 解决: 目标目录权限问题

error in rsync protocol data stream (code 12)