AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 565559
Accepted
Basj
Basj
Asked: 2020-02-04 07:30:20 +0800 CST2020-02-04 07:30:20 +0800 CST 2020-02-04 07:30:20 +0800 CST

Diferença de dois grandes arquivos binários brutos semelhantes

  • 772

Digamos que eu tenha um arquivo de 4 GB abcno 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 abcno meu computador local.

Como calcular um diff binário de abce abc2?

Formulários:

  • Eu só poderia enviar um patcharquivo (provavelmente no máximo 100 MB) para o servidor distante, em vez de reenviar o abc2arquivo inteiro (levaria algumas horas novamente!) e recriar abc2no servidor distante abce patchsomente.

  • Localmente, em vez de desperdiçar 8 GB para fazer backup de ambos abce abc2, eu poderia salvar apenas abc+ 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 patcharquivo, que seja reproduzível posteriormente se eu tiver ambos abce patch.

files diff
  • 5 5 respostas
  • 10090 Views

5 respostas

  • Voted
  1. Best Answer
    Kusalananda
    2020-02-04T08:09:16+08:002020-02-04T08:09:16+08:00

    Para o segundo aplicativo/problema, eu usaria um programa de backup de desduplicação como resticou borgbackup, em vez de tentar acompanhar manualmente "patches" ou diferenças. O resticprograma 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 com borgbackup, então não posso dizer nada sobre esse programa.)

    Calcular e armazenar um diff dos arquivos abce podem ser feitos com .abc2rsync

    Este é um exemplo com abce abc2sendo 153 MB. O arquivo abc2foi modificado substituindo os primeiros 2,3 MB do arquivo por alguns outros dados:

    $ ls -lh
    total 626208
    -rw-r--r--  1 kk  wheel   153M Feb  3 16:55 abc
    -rw-r--r--  1 kk  wheel   153M Feb  3 17:02 abc2
    

    Criamos um patch para transformar abcem abc2e o chamamos de abc-diff:

    $ rsync --only-write-batch=abc-diff abc2 abc
    
    $ ls -lh
    total 631026
    -rw-r--r--  1 kk  wheel   153M Feb  3 16:55 abc
    -rw-------  1 kk  wheel   2.3M Feb  3 17:03 abc-diff
    -rwx------  1 kk  wheel    38B Feb  3 17:03 abc-diff.sh
    -rw-r--r--  1 kk  wheel   153M Feb  3 17:02 abc2
    

    O arquivo gerado abc-diffé o diff real (seu "arquivo de patch"), enquanto abc-diff.shé um script de shell curto que rsynccria para você:

    $ cat abc-diff.sh
    rsync --read-batch=abc-diff ${1:-abc}
    

    Este script modifica abcpara que fique idêntico a abc2, dado o arquivo abc-diff:

    $ md5sum abc abc2
    be00efe0a7a7d3b793e70e466cbc53c6  abc
    3decbde2d3a87f3d954ccee9d60f249b  abc2
    $ sh abc-diff.sh
    $ md5sum abc abc2
    3decbde2d3a87f3d954ccee9d60f249b  abc
    3decbde2d3a87f3d954ccee9d60f249b  abc2
    

    O arquivo abc-diffagora pode ser transferido para qualquer outro lugar que você tenha abc. Com o comando rsync --read-batch=abc-diff abc, você aplicaria o patch ao arquivo abc, transformando seu conteúdo para ser o mesmo do abc2arquivo 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 abc2dados, 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.

    • 20
  2. Kaz
    2020-02-04T18:18:41+08:002020-02-04T18:18:41+08:00

    Como calcular um diff binário de abc e abc2?

    Usando bsdiff/bpatch ou xdelta e outros.

    $ bsdiff older newer patch.bin     # patch.bin is created
    [...]
    $ bspatch older newer patch.bin    # newer is created
    

    No entanto, estas advertências das páginas man devem ser observadas:

    • bsdiffusa 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 .
    • bspatchusa 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.
    • 4
  3. user1794469
    2020-02-04T08:47:19+08:002020-02-04T08:47:19+08:00

    Você já tentou apenas forçar diffa tratar os arquivos como texto:

    diff -ua abc abc2
    

    Conforme explicado aqui .

    • -usaída NUM (padrão 3) linhas de contexto unificado
    • -atratar todos os arquivos como texto

    Isso deve te dar um patch. A desvantagem disso é que as 'linhas' podem ser bastante longas e isso pode inchar o patch.

    • 2
  4. vonbrand
    2020-02-05T05:53:59+08:002020-02-05T05:53:59+08:00

    Use xdelta , ele foi criado exatamente para esse tipo de uso. Baseado em VCDIFF (RFC 3284) nas versões mais recentes.

    • 1
  5. Basj
    2020-02-05T01:41:16+08:002020-02-05T01:41:16+08:00

    Complementos para outras respostas de acordo com meus testes:

    Comdiff

    Eu criei dois arquivos muito semelhantes de 256 MB abce abc2. Então vamos criar o arquivo diff:

    diff -ua abc abc2 > abc-abc2.diff
    

    Agora vamos tentar recuperar abc2graças ao abcarquivo original e abc-abc2.diff:

    cp abc abc3
    patch abc3 < abc-abc2.diff
    

    ou

    cp abc abc3
    patch abc3 -i abc-abc2.diff
    

    ou

    patch abc -i abc-abc2.diff -o abc3
    

    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 abc3arquivo produzido tem apenas 1 KB em vez de 256 MB (atualizarei esta resposta mais tarde aqui).

    Comrsync

    Conforme detalhado na resposta aceita, isso funciona:

    rsync --only-write-batch=abc-abc2-diff abc2 abc
    
    cp abc abc3
    
    rsync --read-batch=abc-abc2-diff abc3 
    

    Comrdiff

    Conforme detalhado nesta resposta , esta também é uma solução:

    rdiff signature abc abc-signature
    rdiff delta abc-signature abc2 abc-abc2-delta
    
    rdiff patch abc abc-abc2-delta abc3
    

    Testado também no Windows com rdiff.exe daqui e funciona.

    • 0

relate perguntas

  • Listar arquivos classificados de acordo com a linha de conteúdo específica

  • Como saber antecipadamente se um .zip tem um diretório pai dentro

  • Como encontrar tipos de arquivos específicos e tar-los?

  • git: use visual diff (meld) somente quando estiver na GUI

  • du/df e ls relatando diferentes usos de disco

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve