Agregar parte faltante

Agregar parte faltante

Tengo un archivo en mi unidad de respaldo de foo.txt(30 GiB).

Tengo un archivo en mi disco habitual foo.txt(60 GiB, se garantiza que los primeros 30 GiB serán exactamente iguales).

¿Cómo puedo agregar solo la parte que falta sin volver a copiar todo el archivo?

¿Quizás algo ddfuncionaría?

Respuesta1

Para sincronizar archivos rsync, tiene una --appendopción para "agregar datos a archivos más cortos":

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

Ejecución de ejemplo

Escenario de prueba copiado flagrantemente de la respuesta de Steeldriver: agregué las opciones -Py -vpara una salida detallada.

$ 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
$ 

Respuesta2

Sí, puedes usarlo dd: el truco consiste en elegir tanto bsx skipcomo obsx seekiguales aexactocompensación requerida

Ex.

Primero, generemos un archivo de prueba: he elegido 60MiB en lugar de 60GiB a modo de ilustración:

$ 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

Ahora copiemos exactamente la primera mitad, usando nuevamente dd(aunque no es necesario)

$ 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

Verifica que sean diferentes:

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

Ahora copiemos de origfilea newfile, omitiendo los primeros 30x 1Mbloques de ambos archivos:

$ 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

Finalmente, verifique que los archivos ahora sean idénticos:

$ cmp origfile newfile
$ 

Respuesta3

Es un archivo enorme, pero si maneja el tamaño, puede usar el splitcomando para dividir el archivo de 60 GB en file1y file2. Luego utilícelo catpara volver a juntar las piezas que desea.

Ejemplo:

split -n2 60Gfile
cat xab >> 30Gfile

split -n2divide el archivo por la mitad y crea 2 archivos llamados xaayxab

Si esto no hace lo que desea, lea el manual dividido ya que el comando tiene otras opciones.

información relacionada