Anexar parte que falta

Anexar parte que falta

Eu tenho um arquivo na minha unidade de backup que tem foo.txt(30 GiB).

Eu tenho um arquivo em minha unidade normal foo.txt(60 GiB, os primeiros 30 GiB são exatamente iguais).

Como posso anexar apenas a parte que falta sem copiar novamente o arquivo inteiro?

Talvez algo ddfuncionasse?

Responder1

Para sincronizar arquivos rsyncexiste uma --appendopção para “acrescentar dados em arquivos mais curtos”:

rsync --append /path/to/foo.txt /path/to/foo.txt
#              ^- original      ^- copy

Exemplo de execução

Cenário de teste copiado flagrantemente da resposta do steeldriver - adicionei as opções -Pe -vpara saída detalhada.

$ dd if=/dev/urandom bs=1M iflag=fullblock count=60 of=origfile
60+0 records in
60+0 records out
62914560 bytes (63 MB, 60 MiB) copied, 0.328983 s, 191 MB/s
$ dd if=origfile bs=1M iflag=fullblock count=30 of=newfile
30+0 records in
30+0 records out
31457280 bytes (31 MB, 30 MiB) copied, 0.0292976 s, 1.1 GB/s
$ cmp origfile newfile
cmp: EOF on newfile
$ rsync -Pv --append origfile newfile
origfile
     62,914,560 100%  365.47MB/s    0:00:00 (xfr#1, to-chk=0/1)

sent 31,465,039 bytes  received 35 bytes  20,976,716.00 bytes/sec
total size is 62,914,560  speedup is 2.00
$ cmp origfile newfile
$ 

Responder2

Sim, você pode usar dd- o truque é escolher bsx skipe obsx seekiguais aoexatodeslocamento necessário

Ex.

Primeiro vamos gerar um arquivo de teste - escolhi 60MiB em vez de 60GiB para fins de ilustração:

$ dd if=/dev/urandom bs=1M iflag=fullblock count=60 of=origfile
60+0 records in
60+0 records out
62914560 bytes (63 MB, 60 MiB) copied, 0.376846 s, 167 MB/s

Agora vamos copiar exatamente a primeira metade - novamente usando dd(embora isso não seja obrigatório)

$ dd if=origfile bs=1M iflag=fullblock count=30 of=newfile
30+0 records in
30+0 records out
31457280 bytes (31 MB, 30 MiB) copied, 0.063891 s, 492 MB/s

Verifique se eles são diferentes:

$ cmp origfile newfile
cmp: EOF on newfile after byte 31457280, in line 122106

Agora vamos copiar from origfileto newfile, pulando os primeiros 30x 1Mblocos de ambos os arquivos:

$ dd if=origfile bs=1M iflag=fullblock skip=30 count=30 of=newfile seek=30
30+0 records in
30+0 records out
31457280 bytes (31 MB, 30 MiB) copied, 0.0632964 s, 497 MB/s

Por fim, verifique se os arquivos agora são idênticos:

$ cmp origfile newfile
$ 

Responder3

É um arquivo enorme, mas se for compatível com o tamanho, você pode usar o splitcomando para dividir o arquivo de 60 GB file1em file2. Em seguida, use catpara juntar as peças que deseja novamente.

Exemplo:

split -n2 60Gfile
cat xab >> 30Gfile

split -n2divide o arquivo ao meio e faz 2 arquivos chamados xaaexab

Se isso não funcionar como você deseja, leia o manual de divisão, pois o comando tem outras opções.

informação relacionada