Назад | Перейти на главную страницу

Есть ли утилита сравнения / слияния для сравнения двоичных файлов и побитовой синхронизации данных в любом направлении на основе различий в двоичных данных?

У меня сложная дилемма. У меня есть файлы на двух разных целевых дисках, скопированные с одного исходного диска. Исходный диск выходил из строя, поэтому я использовал dd для копирования данных в одно место назначения (с параметрами conv=noerror,sync который заполняет блоки error'd нулевыми байтами), и я использовал ddrescue на том же исходном диске для копирования данных во второй раздел, и я слышал, что ddrescue также заполняет ошибки нулевыми байтами.

Теперь у меня есть два целевых диска с почти дублирующимися данными, за исключением того, что некоторые данные на обоих этих целевых дисках определенно различаются. Я могу только предположить, что различия будут вызваны этими нулевыми байтами, которые, кажется, расположены в разных местах среди данных на этих двух целевых дисках. Я могу только предположить, что эти различия вызваны тем, что части файлов были заполнены нулями, в которых были обнаружены ошибки во время копирования. Однако на двух разных целевых дисках места с нулями различаются. Большая часть этих данных состоит из двоичных файлов. Таким образом, некоторые файлы в источнике остаются полностью нетронутыми, в то время как их копии в месте назначения - нет, в то время как другие файлы в месте назначения остаются полностью нетронутыми, а их копии в источнике - нет. Многие из этих файлов тоже являются двоичными.

В идеале я бы хотел синхронизировать оба диска следующим образом:

  • Сравните каждый файл побитно.
  • Если бит левого файла равен 1, а бит правого файла равен 0, скопируйте 1 вправо.
  • Если бит левого файла равен 0, а бит правого файла равен 1, скопируйте этот 1 влево или, по крайней мере, оставьте 1 справа, если двусторонняя синхронизация невозможна.

Для меня эта функция имеет смысл, но есть ли утилита, которая может справиться с этим автоматически? Я думал об использовании для этого rsync, но кажется, что rsync проверяет файл только по размеру и метке времени или по контрольной сумме, а не побитно, и простая контрольная сумма не скажет вам, где есть нули, когда должны быть 1 с. Я также изучил rdiff и bsdiff, оба из которых поддерживают двоичные файлы, но оба они, похоже, просто выводят файл diff, а не выполняют какое-либо фактическое копирование / синхронизацию.

Так существует ли утилита, которая делает то, что я ищу, как описано в моем идеальном поведении синхронизации, описанном выше? Операционная система не обязательно должна иметь значение, поскольку у меня есть доступ к OSX, Windows и Ubuntu.

Похоже, что вам нужен инструмент, который будет извлекать каждый блок обоих файлов, а затем выполнять побитовое ИЛИ на каждом блоке и отправьте результат в новый файл.

Псевдокод может выглядеть так, как показано ниже. Ничего не произойдет с идентичными битами, а биты, которые не идентичны, будут установлены в 1.

while not end-of-files:
  read block file_a
  read block file_b
  merged_block = file_a bitwise_or file_b
  write merged_block to file_c

Rsync должен позволить вам выполнять одностороннюю синхронизацию. Я считаю, что у него также есть опция проверки, чтобы узнать, отличаются ли файлы.