使用 USB 在两个断开连接的服务器之间同步大目录

使用 USB 在两个断开连接的服务器之间同步大目录

我想使用一个太小而无法容纳整个目录的 USB 设备来同步两个断开连接的服务器之间的大目录。每台服务器都拥有大部分数据,并且更改的文件足够小,可以容纳在我的 USB 设备上。

有没有可以用来执行以下步骤的工具?

  1. 设备 B:计算目录 D 的哈希值并将其存储到 USB 设备
  2. 设备 A:计算并比较哈希值。将未同步的文件添加到 USB 设备并记下已删除的文件。
  3. 设备 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 -读取要存档的文件列表stdinf -告诉tar将存档写入到stdoutJ意味着用 压缩存档xz,并v打印tar其存档到的文件列表stderr
  • split -b 3500MB -d将存档分割成 3500MB 的块(我假设您有 4GB 闪存,并且一次运行无法容纳所有数据;您可能根本不需要这样做)
  • cat $( ls -1 x* | sort )连接x*文件;sort是否可以确保它以正确的顺序进行
  • cd /some/dir更改CWD目标目录
  • tar xJvpf -保存文件;J表示用 解压缩xzp表示恢复权限,v使操作变得详细,并f -告诉tar从 读取存档stdin

tar最后,@Stéphane Chazelas 免责声明:这假设 (1) 任一计算机上的文件名不包含换行符,并且 (2) 要镜像的目录不太深(存档中文件的最大路径长度有限制,而且不是很高 - 200 个字符 IIRC)。

答案2

tar结合参数可以-N | --newer | --after帮助你吗?它允许您备份自指定日期以来修改的所有文件。

如果您在每次运行之前创建文件列表(find例如使用),则可以比较文件以查看哪些文件被删除。使用该输出,您可以从目标服务器中删除额外的文件。

相关内容