Rsync工具使用

整理文件

  1. 将fold-rsync 进行同步, 得到 remote/fold-rsync

  2. 将fold-rsync 硬链接到 fold-work, 在 fold-work内重命名

  3. 确保remote中没有 remote/fold-work 这个文件夹. 将fold-rsync fold-work 一起同步过去, 得到 remote/fold-rsync, remote/fold-work. 在这个过程中, remote/fold-work的内容完全来自remote/fold-rsync的硬连接

  4. 此时可删除fold-rsync, 只保留fold-work.

参考: https://lincolnloop.com/blog/detecting-file-moves-renames-rsync/

1
2
3
4
5
6
7
$ gcp -al Weibo Weibo-tmp # local:  Weibo-tmp => Weibo
$ rsync-synchronize Weibo Weibo-tmp rpi:/seagate/ # server:  Weibo-tmp => Weibo
$ rm rpi:/seagate/Weibo #  server:  Weibo-tmp
$ tidy Weibo
# fd .    **/原创微博图片  -td -x  echo mv  -v "{}" "{//}/../.."
$ rsync-synchronize Weibo Weibo-tmp rpi:/seagate/  #  server:  Weibo same as local but hardlink from Weibo-tmp
$ rm Weibo-tmp rpi:/seagate/weibo-tmp

Rsync 重命名

1
2
3
4
$ rsync -avHP --delete-after ~/family/Photos remotebox:backups
$ cd ~/family
$ gcp -rlp Photos Photos-work
$ rsync -avHP --delete-after --no-inc-recursive ~/family/Photos ~/family/Photos-work remotebox:backups

Rsync 选项

  • -n, --dry-run: perform a trial run with no changes made

  • -z, --compress: compress file data during the transfer

  • -h, --human-readable: output numbers in a human-readable format

  • -P same as --partial --progress

  • -a, --archive :archive mode; equals -rlptgoD (no -H,-A,-X)

  • --partial: keep partially transferred files

  • -I --ignore-times don't skip files that match size and time

  • --size-only: skip files that match in size

  • -c --checksum: Use checksum to sync file

  • --remove-source-files: sender removes synchronized files (non-dir)

  • -H --hard-links: Look for hard-linked files in the source and link together the corresponding files on the destination.

  • --delete-delay: Request that the file-deletions on the receiving side be computed during the transfer.

 rsync  -avhHPz --delete-delay --delay-updates --fuzzy

-b--backup参数指定在删除或更新目标目录已经存在的文件时,将该文件更名后进行备份,默认行为是删除。更名规则是添加由--suffix参数指定的文件后缀名,默认是~

--backup-dir参数指定文件备份时存放的目录,比如--backup-dir=/path/to/backups

-c--checksum参数改变rsync的校验方式。默认情况下,rsync 只检查文件的大小和最后修改日期是否发生变化,如果发生变化,就重新传输;使用这个参数以后,则通过判断文件内容的校验和,决定是否重新传输。

--existing--ignore-non-existing参数表示不同步目标目录中不存在的文件和目录。

-i参数表示输出源目录与目标目录之间文件差异的详细情况。

--include参数指定同步时要包括的文件,一般与--exclude结合使用。

--link-dest参数指定增量备份的基准目录。

-P参数是--progress--partial这两个参数的结合。

--partial参数允许恢复中断的传输。不使用该参数时,rsync会删除传输到一半被打断的文件;使用该参数后,传输到一半的文件也会同步到目标目录,下次同步时再恢复中断的传输。一般需要与--append--append-verify配合使用。

--partial-dir参数指定将传输到一半的文件保存到一个临时目录,比如--partial-dir=.rsync-partial。一般需要与--append--append-verify配合使用。

同步设置

--ignore-existing参数表示只要该文件在目标目录中已经存在,就跳过去,不再同步这些文件。

--remove-source-files参数表示传输成功后,删除发送方的文件。

--size-only参数表示只同步大小有变化的文件,不考虑文件修改时间的差异。

--suffix参数指定文件名备份时,对文件名添加的后缀,默认是~

-u--update参数表示同步时跳过目标目录中修改时间更新的文件,即不同步这些有更新的时间戳的文件。

Rsync 协议

除了使用 SSH,如果另一台服务器安装并运行了 rsync 守护程序,则也可以用rsync://协议(默认端口873)进行传输。具体写法是服务器与目标目录之间使用双冒号分隔::

1
$ rsync -av source/ 192.168.122.32::module/destination

注意,上面地址中的module并不是实际路径名,而是 rsync 守护程序指定的一个资源名,由管理员分配。

如果想知道 rsync 守护程序分配的所有 module 列表,可以执行下面命令。

1
$ rsync rsync://192.168.122.32

rsync 协议除了使用双冒号,也可以直接用rsync://协议指定地址。

1
$ rsync -av source/ rsync://192.168.122.32/module/destination

基准目录

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

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

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

--link-dest参数用来指定同步时的基准目录。

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

上面命令中,--link-dest参数指定基准目录/compare/path,然后源目录/source/path跟基准目录进行比较,找出变动的文件,将它们拷贝到目标目录/target/path。那些没变动的文件则会生成硬链接。这个命令的第一次备份时是全量备份,后面就都是增量备份了。

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/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},并将软链接${BACKUP_DIR}/latest指向这个目录。下一次备份时,就将${BACKUP_DIR}/latest作为基准目录,生成新的备份目录。最后,再将软链接${BACKUP_DIR}/latest指向新的备份目录。

updatedupdated2023-06-052023-06-05
Update https-ca.md