我需要同步两个大磁盘,但我只能逐个访问它们。所以我需要分两个步骤来划分这个过程:
source
的差异destination
。 是否可以将destination
的当前状态保存到文件中,仅在较小的磁盘上复制差异?使用rsync或其他工具?
类似的东西:
# on `destination` disk:
rsync <magic option> -o "status_file.delta" destination/
# `source` to `temporary`:
rsync <magic option> -i "status_file.delta" source/ temporary/
# `temporary` to `destination`:
rsync -a temporary/ destination/
谢谢!
答案 0 :(得分:0)
是的!但是,您需要在源磁盘上存储两个数据副本:一个当前(源),一个与目标上的状态匹配。
将源同步到第二个副本并记录更改内容:
rsync -a --write-batch=temporary/delta source/ source2/
source
和source2
现在应该匹配,您应该有一个名为delta
的文件。
交换磁盘并将更改应用到目标:
rsync -a --read-batch=temporary/delta destination/
source
,source2
和destination
现在所有匹配。
然后,您可以继续对source
进行更改,但不要修改source2
,直到您下次同步到destination
。< / p>
答案 1 :(得分:0)
鉴于rsync需要同时显示两组完整数据,因此需要一种替代解决方案。您可以使用常规UNIX命令轻松地执行此操作:
独立扫描两组数据,来源和目的地:
find source/ -type f -print0 | xargs -0 md5sum > temporary/source-signatures
find destination/ -type f -print0 | xargs -0 md5sum > temporary/destination-signatures
区分两个签名文件。
diff -u destination-signatures source-signatures > sync-diff
可选生成脚本以删除已删除的文件:
grep '^-' sync-diff | xargs echo rm > delete.sh
捕获已更改的文件:
grep '^+' | sed 's/.* //' | xargs tar Af file.tar
小心地,在目标目录中运行delete.sh
脚本,然后展开tar文件,使其正确放置文件。
如果你的名字中有任何空格或特殊字符的文件,那么你需要对删除脚本和tar进程更加小心。特别是xargs
不能胜任这项工作。