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 dd
funcionaría?
Respuesta1
Para sincronizar archivos rsync
, tiene una --append
opció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 -P
y -v
para 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 bs
x skip
como obs
x seek
iguales 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 origfile
a newfile
, omitiendo los primeros 30
x 1M
bloques 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 split
comando para dividir el archivo de 60 GB en file1
y file2
. Luego utilícelo cat
para volver a juntar las piezas que desea.
Ejemplo:
split -n2 60Gfile
cat xab >> 30Gfile
split -n2
divide el archivo por la mitad y crea 2 archivos llamados xaa
yxab
Si esto no hace lo que desea, lea el manual dividido ya que el comando tiene otras opciones.