Existe o bdiff (1) no Linux?


9

Existe um bdiff(1)comando no Solaris, que permite diff(1)arquivos com tamanho maior que o tamanho da RAM ( http://docs.oracle.com/cd/E19683-01/806-7612/files-23/index.html ).

Existe algo parecido no Linux? Eu tentei pesquisar no Google, mas não encontro qual pacote possui bdiffno Ubuntu.



Respostas:


13

O bdiff parece estar disponível no Linux (pelo menos como parte do Heirloom Toolchest ).

diff

Eu provavelmente usaria apenas diff antigo regular com essa opção no entanto:

diff --speed-large-files bigfileA bigfileB

Por que não funciona?

Veja o comentário de @EvanTeitelman, --speed-large-filesnão afeta o modo como os arquivos são carregados na memória.

Pode ser demonstrado / confirmado que não funciona usando o seguinte comando:

fallocate -l 10G testa; fallocate -l 10G testb && \
        diff --speed-large-files -a testa testb

bsdiff

Difícil de confirmar isso, mas encontrei uma ferramenta chamada da bsdiffqual deriva bdiff. Eu confirmei que esta ferramenta está no Ubuntu, simplesmente apt-get install bsdiff.

Por que isso pode funcionar?

Mais uma vez, obrigado @EvanTeitelman nos comentários, o bsdiffacima é uma ferramenta diff para arquivos binários. bsdiffé uma ferramenta diff binária e pode lidar com arquivos grandes. Não está claro o tamanho. Consulte os seguintes links para um tópico que discute seu uso.

rdiff

Eu acho que você também pode usar o rdiff para fazer isso também. Rdiff é capaz de lidar com arquivos muito grandes.

  1. Crie uma assinatura de um arquivo:

    rdiff signature A sigs.txt
    
  2. Use o arquivo de assinatura gerado sigs.txt e o outro arquivo grande B para criar o delta:

    rdiff delta sigs.txt B deltaAB.txt
    
  3. O Delta contém todas as informações necessárias para recriar o arquivo B quando você possui apenas A e o arquivo delta deltaAB.txt.

    Para recriar B, execute:

    rdiff patch A deltaAB.txt B
    

Por que isso funciona?

Eu encontrei este post no blog intitulado: Uma diferença melhor ou o que fazer quando a diferença GNU fica sem memória ("diff: memória esgotada") , que relata que um riff de arquivos de 4,5 GB consumia apenas ~ 66 MB de RAM.

lfhex

O lfhex é um aplicativo para visualizar e editar arquivos em texto hexadecimal, octal, binário ou ascii. A principal força do lfhex é sua capacidade de trabalhar com arquivos muito maiores que a memória do sistema. É uma ferramenta GUI no entanto.

captura de tela

                  ss de lfhex]! [ss de lfhex

Referências


Embora isso nem sempre esteja documentado, o GNU diff permite que você use -Hcomo sinônimo --speed-large-files.

2
bsdiffé uma ferramenta diff binária, não uma ferramenta diff de arquivo grande.

3
Infelizmente, parece que o --speed-large-filessinalizador não afeta a maneira pela qual o GNU diff carrega arquivos na memória. Tente executar fallocate -l 10G testa; fallocate -l 10G testb && diff --speed-large-files -a testa testbpara confirmar isso. (Ou dê uma olhada no código fonte.) #

2
I conseguiu construir bdiffa partir da herança Toolchest depois de substituir /sbin/shpor /bin/shnos makefiles. Agora, quando tento executá-lo no lugar, entendo bdiff: Can not execute '/usr/5bin/diff'. Desculpe, não quero instalar nada no /usr/5bin/. Esta não é uma solução viável. As outras opções mencionadas aqui não funcionam para mim porque quero observar as diferenças como texto.
Christian Pietsch

1
PS: Surpreendentemente, lfhex -c file1 file2funciona bem para mim depois de definir o modo de exibição -> base de edição -> ASCII para os dois painéis.
Christian Pietsch
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.