如何让 rsync 在另一个目录中另外存储差异变更日志?

如何让 rsync 在另一个目录中另外存储差异变更日志?

rsync --link-dir由于硬链接,我用来获取每日快照,占用的空间很少。然而,最好还有一个目录,在镜像原始结构的同时,仅包含实际更改的文件(到完整备份的硬链接)。举个例子,这是之前的目录结构:

source/        <- contains the original data
backup/current <- symlink to the most recent snapshot
backup/12102?  <- recent daily snapshots (irrelevant)

这是之后所需的结构:

source/
backup/current <- symlink to the _updated_ snapshot
backup/previous<- symlink to the snapshot that was was "current" before
backup/12102?  <- ...
backup/current.changes  <- (symlink to) directory containing _only_ the files that
                           have changed between "current" and "previous"

答案1

这是我最终使用的脚本:

#!/bin/bash
set +x
SRC=$1
BCK=$SRC/.snapshots
CUR=$BCK/current
DAT=$(date +%Y-%m/%y%m%d)
DST=$BCK/$DAT
PAR="-aP --chmod=a-w,o-rwx --no-owner"

LNK="--link-dest=$CUR --link-dest=$DST.changeset"
CMP="--compare-dest=$CUR --prune-empty-dirs"
XCL="--exclude-from $BCK/.rsyncignore"
LOG="$BCK/log/$DAT"
LGP="--log-file $LOG"

mkdir -pm750 $DST.incomplete
mkdir -pm750 $DST.changeset.incomplete
mkdir -pm750 $(dirname $LOG)

rsync $PAR $CMP $XCL $LGP.change.log $SRC/ $DST.changeset.incomplete | tee $LOG.change.out
mv $DST.changeset.incomplete $DST.changeset
find $DST.changeset -type d -empty -delete
rsync $PAR $LNK $XCL $LGP.log $SRC/ $DST.incomplete | tee $LOG.out
mv $DST.incomplete $DST
rm -f $CUR
ln -s $DAT $CUR

它将以某种DST=$1/.snapshots/YYYY-MM/yymmdd方式创建快照,并且$DST.changeset仅包含已已创建或者修改的。删除(和间接mv)无法识别,尽管第三次rsync交换$DST$CUR创建反向modlog,然后可以使用diff语法进行一些直观的重命名,将其与不完整的变更集合并...或者,您只需解析rsync的日志输出或直接使用git,因为你基本上是版本控制......


旧答案:

我的第一个想法是使用先前备份的硬链接副本以及参数--backup-dir,但这将获得以前的已更改文件的版本,这与我正在寻找的相反。诀窍是颠倒这一点:

  • 首先,使用硬链接创建常用的快照:(
    rsync -a --link-dest=/backup/current /source/ /backup/$TODAY.incomplete
    您可能必须使用--no-owner --chmod=...等来rsync明确使用硬链接)
  • 现在用前一个快照覆盖新快照,但让我们--backup移动更改的文件:
    rsync -ab --backup-dir=/backup/$TODAY.changelog.incomplete --delete /backup/current/ /backup/$TODAY.incomplete
    mv /backup/$TODAY.changelog.incomplete /backup/$TODAY.changelog
  • 恭喜,您以创建变更日志为代价搞砸了新快照!
    修复此问题(和清理)
    cp -alf /backup/$TODAY.changelog/* /backup/$TODAY.incomplete
    mv /backup/$TODAY.incomplete /backup/$TODAY
    mv -f /备份/当前/备份/上一个
    ln -sf /备份/$TODAY /备份/当前

请注意,此“更改日志”实际上仅包含已更改或新文件(仅当您没有忘记时才包含后者--delete);删除和mvs 都不会被跟踪。一些修改可能会解决这个问题...

相关内容