Digamos que eu tenha um arquivo de 4 GB abc
no meu computador local. Fiz o upload para um servidor distante via SFTP, demorou algumas horas.
Agora modifiquei ligeiramente o arquivo (provavelmente 50 MB no máximo, mas não bytes consecutivos neste arquivo) localmente e salvei-o em abc2
. Também mantive o arquivo original abc
no meu computador local.
Como calcular um diff binário de abc
e abc2
?
Formulários:
Eu só poderia enviar um
patch
arquivo (provavelmente no máximo 100 MB) para o servidor distante, em vez de reenviar oabc2
arquivo inteiro (levaria algumas horas novamente!) e recriarabc2
no servidor distanteabc
epatch
somente.Localmente, em vez de desperdiçar 8 GB para fazer backup de ambos
abc
eabc2
, eu poderia salvar apenasabc
+patch
, então levaria < 4100 MB apenas.
Como fazer isso?
PS: para texto, eu sei diff
, mas aqui estou procurando algo que possa funcionar para qualquer formato binário bruto, podem ser arquivos zip ou executáveis ou até mesmo outros tipos de arquivo.
PS2: Se possível, não quero usar rsync
; Eu sei que ele pode replicar alterações entre 2 computadores de maneira eficiente (não reenviando dados que não foram alterados), mas aqui eu realmente quero ter um patch
arquivo, que seja reproduzível posteriormente se eu tiver ambos abc
e patch
.
Para o segundo aplicativo/problema, eu usaria um programa de backup de desduplicação como
restic
ouborgbackup
, em vez de tentar acompanhar manualmente "patches" ou diferenças. Orestic
programa de backup permite fazer backup de diretórios de várias máquinas para o mesmo repositório de backup, desduplicando os dados de backup tanto entre fragmentos de arquivos de uma máquina individual quanto entre máquinas. (Eu não tenho experiência de usuário comborgbackup
, então não posso dizer nada sobre esse programa.)Calcular e armazenar um diff dos arquivos
abc
e podem ser feitos com .abc2
rsync
Este é um exemplo com
abc
eabc2
sendo 153 MB. O arquivoabc2
foi modificado substituindo os primeiros 2,3 MB do arquivo por alguns outros dados:Criamos um patch para transformar
abc
emabc2
e o chamamos deabc-diff
:O arquivo gerado
abc-diff
é o diff real (seu "arquivo de patch"), enquantoabc-diff.sh
é um script de shell curto quersync
cria para você:Este script modifica
abc
para que fique idêntico aabc2
, dado o arquivoabc-diff
:O arquivo
abc-diff
agora pode ser transferido para qualquer outro lugar que você tenhaabc
. Com o comandorsync --read-batch=abc-diff abc
, você aplicaria o patch ao arquivoabc
, transformando seu conteúdo para ser o mesmo doabc2
arquivo no sistema onde você criou o diff.Reaplicar o patch uma segunda vez parece seguro. Não há mensagens de erro nem o conteúdo do arquivo muda (a soma de verificação MD5 não muda).
Observe que, a menos que você crie um "patch reverso" explícito, não há como desfazer facilmente a aplicação do patch.
Também testei escrever a modificação de 2,3 MB em algum outro local nos
abc2
dados, um pouco mais adiante (em cerca de 50 MB), bem como no início. O "patch" gerado tinha 4,6 MB de tamanho, sugerindo que apenas os bits modificados eram armazenados no patch.Usando bsdiff/bpatch ou xdelta e outros.
No entanto, estas advertências das páginas man devem ser observadas:
bsdiff
usa memória igual a 17 vezes o tamanho de oldfile e requer um tamanho mínimo absoluto de conjunto de trabalho de 8 vezes o tamanho de oldfile .bspatch
usa memória igual ao tamanho de oldfile mais o tamanho de newfile , mas pode tolerar um conjunto de trabalho muito pequeno sem uma perda dramática de desempenho.Você já tentou apenas forçar
diff
a tratar os arquivos como texto:Conforme explicado aqui .
-u
saída NUM (padrão 3) linhas de contexto unificado-a
tratar todos os arquivos como textoIsso deve te dar um patch. A desvantagem disso é que as 'linhas' podem ser bastante longas e isso pode inchar o patch.
Use xdelta , ele foi criado exatamente para esse tipo de uso. Baseado em VCDIFF (RFC 3284) nas versões mais recentes.
Complementos para outras respostas de acordo com meus testes:
Com
diff
Eu criei dois arquivos muito semelhantes de 256 MB
abc
eabc2
. Então vamos criar o arquivo diff:Agora vamos tentar recuperar
abc2
graças aoabc
arquivo original eabc-abc2.diff
:ou
ou
Funciona em Linux. Eu também tentei no Windows (patch.exe e diff.exe também estão disponíveis), mas por um motivo desconhecido ele falhou: o
abc3
arquivo produzido tem apenas 1 KB em vez de 256 MB (atualizarei esta resposta mais tarde aqui).Com
rsync
Conforme detalhado na resposta aceita, isso funciona:
Com
rdiff
Conforme detalhado nesta resposta , esta também é uma solução:
Testado também no Windows com rdiff.exe daqui e funciona.