Acrescentar parte faltante

0

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

Eu tenho um arquivo na minha unidade regular que é foo.txt (60 GiB, primeiro 30 GiB é garantido para ser exatamente o mesmo).

Como posso acrescentar apenas a parte que falta sem recopilar todo o arquivo?

Talvez algo com dd funcione?

    
por tfstwbbnb 04.06.2018 / 03:12

3 respostas

2

Para sincronizar arquivos, há rsync , e tem uma opção --append para "anexar dados a arquivos menores":

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

Exemplo de execução

Cenário de teste copiado flagrantemente da resposta da steeldriver - adicionei as opções -P e -v para a 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
$ 
    
por dessert 04.06.2018 / 08:52
2

Sim, você pode usar dd - o truque é escolher bs x skip e obs x seek igual ao exato deslocamento necessário

Ex.

Primeiro, vamos gerar um arquivo de teste - eu escolhi 60MiB ao invés de 60GiB para ilustrar:

$ 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 dela - 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 de origfile para newfile , ignorando os primeiros blocos 30 x 1M 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
$ 
    
por steeldriver 04.06.2018 / 05:01
0

Esse é um arquivo grande, mas se ele manipular o tamanho, você pode usar o comando split para dividir o arquivo de 60 GB em file1 e file2 . Em seguida, use cat para colocar as partes que você deseja novamente.

Exemplo:

split -n2 60Gfile
cat xab >> 30Gfile

split -n2 divide o arquivo ao meio e cria dois arquivos chamados xaa e xab

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

    
por rkeating 04.06.2018 / 03:42