Tengo un pequeño dilema aquí ...
Necesitaba mover aproximadamente 70 GB de archivos de uno de mis servidores al otro, así que decidí que reprimirlos y enviar el archivo sería la forma más rápida.
Sin embargo, al servidor receptor solo le quedan 5 GB de espacio después de recibir el archivo tar.
¿Hay alguna forma de extraer el alquitrán 'in situ'? No necesito guardar el archivo después de que se haya extraído, por lo que me preguntaba si es posible hacer esto.
Editar: Cabe señalar que el archivo ya ha sido enviado, y me gustaría evitar reenviarlo a través de un método diferente.
Si la otra máquina tiene ssh, le recomendaría rsync como otra alternativa que no utiliza un archivo tar:
Y ten cuidado con el líder
/
Editar actualización
Bueno, veo cómo esto es ahora un gran problema si no puede eliminarlo y volver a comenzar con rsync. Probablemente probaría un extracto selectivo y lo eliminaría del alquitrán.
extracto selectivo:
eliminación selectiva:
Sin embargo, parece que pasarás mucho tiempo codificando un script para esto ...
fuente
Básicamente, lo que necesita es la posibilidad de canalizar el archivo en alquitrán y "cortar" el frente a medida que avanza.
En StackOverflow, alguien preguntó cómo truncar un archivo al frente , pero parece que no es posible. Todavía puede completar el comienzo del archivo con ceros de una manera especial para que el archivo se convierta en un archivo disperso , pero no sé cómo hacerlo. Sin embargo, podemos truncar el final del archivo. Pero tar necesita leer el archivo hacia adelante, no hacia atrás.
Solución 1
Un nivel de indirección resuelve todos los problemas. Primero invierta el archivo en su lugar, luego léalo hacia atrás (lo que resultará en la lectura del archivo original hacia adelante) y trunca el final del archivo invertido a medida que avanza.
Tendrá que escribir un programa (c, python, lo que sea) para intercambiar el principio y el final del archivo, fragmento por fragmento, y luego canalizar estos fragmentos al alquitrán mientras trunca el archivo un fragmento a la vez. Esta es la base para la solución 2, que es quizás más simple de implementar.
Solución 2
Otro método es dividir el archivo en pequeños fragmentos en el lugar , luego eliminar esos fragmentos a medida que los extraemos. El siguiente código tiene un tamaño de fragmento de un megabyte, ajústelo según sus necesidades. Más grande es más rápido, pero ocupará más espacio intermedio al dividir y durante la extracción.
Dividir el archivo archive.tar:
Canalice esos archivos en tar (tenga en cuenta que necesitamos la variable chunkprefix en el segundo terminal):
Como usamos una tubería con nombre (
mkfifo fifo
), no es necesario que canalice todos los fragmentos a la vez. Esto puede ser útil si tienes poco espacio. Puedes seguir los siguientes pasos:while [ -e … ]; do cat "$chunk…; done
ciclo ha terminado (segundo terminal):tar
comando, NO quite el fifo (primer terminal), pero puede ejecutarsync
, por si acaso,while [ -e … ]; do cat "$chunk…; done
líneas nuevamente.Por supuesto, todo esto es de alto voltaje , primero querrá verificar que todo esté bien en un archivo ficticio, porque si comete un error, adiós a los datos .
Nunca sabrá si el primer terminal (
tar
) realmente ha terminado de procesar el contenido del fifo, por lo que si lo prefiere, puede ejecutar esto, pero no tendrá la posibilidad de intercambiar fragmentos sin problemas con otro disco:Descargo de responsabilidad
Tenga en cuenta que para que todo esto funcione, su shell, cola y truncamiento deben manejar enteros de 64 bits correctamente (no necesita una computadora de 64 bits ni un sistema operativo para eso). El mío sí, pero si ejecuta el script anterior en un sistema sin estos requisitos, perderá todos los datos en archive.tar .
Y en cualquier caso, algo diferente a eso va mal, perderá todos los datos en archive.tar de todos modos, así que asegúrese de tener una copia de seguridad de sus datos.
fuente
Si tiene archivos de objeto para mover, intente quitarlos. Esto ahorrará una cantidad considerable de espacio.
fuente