У меня сложная дилемма. У меня есть файлы на двух разных целевых дисках, скопированные с одного исходного диска. Исходный диск выходил из строя, поэтому я использовал 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 должен позволить вам выполнять одностороннюю синхронизацию. Я считаю, что у него также есть опция проверки, чтобы узнать, отличаются ли файлы.