我想使用一个太小而无法容纳整个目录的 USB 设备来同步两个断开连接的服务器之间的大目录。每台服务器都拥有大部分数据,并且更改的文件足够小,可以容纳在我的 USB 设备上。
有没有可以用来执行以下步骤的工具?
- 设备 B:计算目录 D 的哈希值并将其存储到 USB 设备
- 设备 A:计算并比较哈希值。将未同步的文件添加到 USB 设备并记下已删除的文件。
- 设备 B:同步从 USB 设备更改为 D,现在与设备 A 具有相同的版本。
据我所知,rsync、rdiff-backup 和 unison 等工具不支持此操作,因此我对此的最佳解决方案是编写一些简单的脚本来执行此操作。
答案1
最简单的方法是使用交叉电缆并连接两台机器。 :) 但如果你绝对必须使用闪存和一些胶带来做到这一点,你可以这样做:
在目的地机器:
find /some/dir -type f -print0 | xargs -0 sha1sum -b | sort >dst.txt
- 将
dst.txt
文件复制到来源机器
在来源机器:
find /some/dir -type f -print0 | xargs -0 sha1sum -b | sort >src.txt
comm -23 src.txt dst.txt | cut -b 43- | (cd /some/dir; tar cJvf - --files-from -) | split -b 3500MB -d
x*
将文件一一复制到目的地机器rm -f x* src.txt dst.txt
在目的地再次机器:
cat $( ls -1 x* | sort ) | (cd /some/dir; tar xJvpf -)
rm -f x*
这应该如何工作:
dst.txt
和文件src.txt
包含两台计算机上文件的 SHA-1 总和comm -23 src.txt dst.txt
选择仅存在于来源机器,或两者都存在但不同cut -b 43-
仅保留文件名;这是需要复制的文件列表cd /some/dir
更改CWD
源目录tar cJvpf - --files-from -
制作一堆档案;--files-from -
读取要存档的文件列表stdin
,f -
告诉tar
将存档写入到stdout
,J
意味着用 压缩存档xz
,并v
打印tar
其存档到的文件列表stderr
split -b 3500MB -d
将存档分割成 3500MB 的块(我假设您有 4GB 闪存,并且一次运行无法容纳所有数据;您可能根本不需要这样做)cat $( ls -1 x* | sort )
连接x*
文件;sort
是否可以确保它以正确的顺序进行cd /some/dir
更改CWD
目标目录tar xJvpf -
保存文件;J
表示用 解压缩xz
,p
表示恢复权限,v
使操作变得详细,并f -
告诉tar
从 读取存档stdin
。
tar
最后,@Stéphane Chazelas 免责声明:这假设 (1) 任一计算机上的文件名不包含换行符,并且 (2) 要镜像的目录不太深(存档中文件的最大路径长度有限制,而且不是很高 - 200 个字符 IIRC)。
答案2
tar
结合参数可以-N | --newer | --after
帮助你吗?它允许您备份自指定日期以来修改的所有文件。
如果您在每次运行之前创建文件列表(find
例如使用),则可以比较文件以查看哪些文件被删除。使用该输出,您可以从目标服务器中删除额外的文件。