Existe um utilitário diff / merge para comparar arquivos binários e sincronizar dados bit a bit em qualquer direção com base em diferenças em dados binários?

3

Eu tenho um dilema complicado. Eu tenho alguns arquivos em duas unidades de destino diferentes, copiadas da mesma unidade de origem. A unidade de origem estava falhando, então usei o dd para copiar os dados para um destino (com as opções conv=noerror,sync , que preenchem os blocos com erros de zero bytes) e usei o ddrescue na mesma unidade de origem para copiar dados para um segundo partição, e ouvi dizer que o ddrescue também preenche erros com zero bytes.

Agora, tenho duas unidades de destino com dados quase duplicados, exceto pelo fato de que alguns dos dados dessas duas unidades de destino são definitivamente diferentes. Eu só posso presumir que as diferenças serão causadas por esses bytes zero, que parecem estar localizados em lugares diferentes entre os dados nessas duas unidades de destino. Eu só posso presumir que essas diferenças estão sendo causadas pelas partes dos arquivos que foram preenchidos com zero onde erros foram encontrados durante a cópia. No entanto, os pontos preenchidos com zero são diferentes nas duas unidades de destino separadas. A maioria desses dados consiste em arquivos binários. Portanto, alguns arquivos na origem estão totalmente intactos, enquanto seus equivalentes no destino não estão, enquanto outros arquivos estão totalmente intactos no destino, enquanto suas contrapartes na origem não estão. Muitos desses arquivos também são arquivos binários.

Ideally, I'd like to synchronize both drives as follows:

  • Compare each file, bit-by-bit.
  • If the left file's bit is 1 and the right file's bit is 0, copy the 1 over to the right.
  • If the left file's bit is 0 and the right file's bit is 1, copy that 1 to the left, or at least keep the 1 on the right, if two-way synchronization isn't an option.

Essa funcionalidade faz sentido para mim, mas existe um utilitário que possa lidar com isso automaticamente? Pensei em usar o rsync para isso, mas parece que o rsync só verifica o arquivo com base no tamanho & timestamp ou por soma de verificação, em vez de bit por bit, e uma soma de verificação simples não informa onde há 0s quando deveria haver 1s. Eu também olhei para rdiff e bsdiff, ambos suportam arquivos binários, mas ambos parecem apenas produzir um arquivo diff, ao invés de fazer qualquer cópia / sincronização real.

Então existe uma utilidade que faz o que eu estou procurando, como descrito no meu comportamento de sincronização ideal descrito acima? O SO não deve necessariamente importar, pois tenho acesso ao OSX, ao Windows e ao Ubuntu.

    
por purefusion 08.02.2011 / 17:26

2 respostas

3

Parece quase que o que você quer é uma ferramenta, que recupera cada bloco de ambos os arquivos e, em seguida, faz um OR bit a bit em cada bloco e envie a saída para um novo arquivo.

O código psuedo pode parecer abaixo. Nada aconteceria a bits idênticos e bits que não idênticos seriam definidos como 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
    
por 08.02.2011 / 18:35
0

O Rsync deve permitir que você faça uma sincronização. Acredito que também tenha uma opção de verificação para informar se os arquivos são diferentes.

    
por 08.02.2011 / 17:31