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 dd
funcionasse?
Responder1
Para sincronizar arquivos rsync
existe uma --append
opçã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 -P
e -v
para 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 bs
x skip
e obs
x seek
iguais 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 origfile
to newfile
, pulando os primeiros 30
x 1M
blocos 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 split
comando para dividir o arquivo de 60 GB file1
em file2
. Em seguida, use cat
para juntar as peças que deseja novamente.
Exemplo:
split -n2 60Gfile
cat xab >> 30Gfile
split -n2
divide o arquivo ao meio e faz 2 arquivos chamados xaa
exab
Se isso não funcionar como você deseja, leia o manual de divisão, pois o comando tem outras opções.