Существует ли утилита сравнения / слияния для сравнения двоичных файлов и битовой синхронизации данных в обоих направлениях на основе различий в двоичных данных?
У меня сложная дилемма. У меня есть несколько файлов на двух разных целевых дисках, скопированных с одного и того же исходного диска. На исходном диске произошел сбой, поэтому я использовал dd для копирования данных в одно место назначения (с параметрами conv=noerror,sync
который заполняет ошибочные блоки нулевыми байтами), и я использовал ddrescue на том же исходном диске для копирования данных во второй раздел, и я слышал, что ddrescue также заполняет ошибки нулевыми байтами.
Теперь у меня есть два целевых диска с почти дублированными данными, за исключением того, что некоторые данные на обоих этих целевых дисках определенно отличаются. Я могу только предположить, что различия будут вызваны теми нулевыми байтами, которые, кажется, расположены в разных местах среди данных на этих двух целевых дисках. Я могу только предположить, что эти различия вызваны частями файлов, которые были заполнены нулями, где были обнаружены ошибки во время копирования. Однако заполненные нулями пятна отличаются на двух отдельных целевых дисках. Большая часть этих данных состоит из двоичных файлов. Таким образом, некоторые файлы в источнике являются полностью неповрежденными, в то время как их аналоги в месте назначения - нет, в то время как другие файлы являются полностью неповрежденными в месте назначения, в то время как их аналоги в источнике - нет. Многие из этих файлов тоже бинарные.
В идеале я хотел бы синхронизировать оба диска следующим образом:
- Сравните каждый файл, побитно.
- Если бит левого файла равен 1, а бит правого файла равен 0, скопируйте 1 вправо.
- Если бит левого файла равен 0, а бит правого файла равен 1, скопируйте этот 1 слева или, по крайней мере, оставьте 1 справа, если двусторонняя синхронизация не возможна.
Эта функциональность имеет смысл для меня, но есть ли утилита, которая может обрабатывать это автоматически? Я думал об использовании rsync для этого, но кажется, что rsync проверяет файл только по размеру и временной метке или по контрольной сумме, а не по битам, и простая контрольная сумма не скажет вам, где есть 0, когда следует быть 1 с. Я также изучил rdiff и bsdiff, которые поддерживают двоичные файлы, но оба они, похоже, просто выводят файл diff, а не выполняют какое-либо фактическое копирование / синхронизацию.
Так существует ли утилита, которая делает то, что я ищу, как описано в моем идеальном поведении синхронизации, описанном выше? ОС не обязательно должна иметь значение, так как у меня есть доступ к OSX, Windows и Ubuntu.
2 ответа
Похоже, что вам нужен инструмент, который будет извлекать каждый блок обоих файлов, а затем делать побитовое ИЛИ для каждого блока и отправлять вывод в новый файл.
Псевдо-код может выглядеть следующим образом. Ничего не случится с идентичными битами, и биты, которые, если не идентичны, бит будут установлены в 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 должен позволить вам выполнить синхронизацию в одном направлении. Я считаю, что он также имеет возможность проверки, чтобы сказать, если файлы отличаются.