Seu algoritmo é implementado no GNU dd
.
dd bs=512 if=A of=B conv=sparse,notrunc
Por favor, verifique isso com alguns arquivos de teste de sua escolha. Você não quer inadvertidamente danificar seu arquivo B
. Um algoritmo melhor seria verificar se B
também tem zeros nessa posição, o que é algo que dd
não faz.
Quanto a dois computadores diferentes, você tem várias opções. Use um sistema de arquivos de rede que suporte buscas em gravações (nem todas); transferir o arquivo antecipadamente; ou canalizar através do SSH da seguinte forma:
dd if=A | ssh -C B-host dd of=B conv=sparse,notrunc
# or the other way around
ssh -C A-host dd if=A | dd of=B conv=sparse,notrunc
A opção ssh -C
permite a compactação; você estaria transferindo gigabytes de zeros pela rede.