Tengo una unidad de 100 GB que tiene un archivo de 95 GB. Necesito liberar algo de espacio en la unidad (y en este momento transferir el archivo fuera de la unidad no es una opción). El archivo se comprimiría bien con gzip
o bz2
o lo que sea, pero todos estos programas escriben el archivo comprimido en un archivo separado. No tengo suficiente espacio libre para esto.
¿Hay alguna forma de usar herramientas de compresión estándar u otras utilidades de Unix para comprimir el archivo sin usar espacio en disco adicional (o al menos una cantidad mínima de espacio en disco adicional)? Me imagino algo que comprime parte del archivo a la vez y escribe los resultados directamente sobre el archivo. Me doy cuenta de que esto sería arriesgado, ya que el archivo se dañaría si se interrumpiera la compresión, pero no creo que tenga otra opción.
fuente
Respuestas:
Esta es una prueba de concepto bash one-liner, pero debería ayudarlo a comenzar. Úselo bajo su propio riesgo.
Esto funciona canalizando datos gz a un proceso dd que los vuelve a escribir en el mismo archivo. Al finalizar, el archivo se trunca al tamaño de la salida gz.
Esto supone que la última línea de salida de dd coincide:
Donde el primer campo es un entero de bytes escritos. Este es el tamaño al que deberá truncarse el archivo. No estoy 100% seguro de que el formato de salida sea siempre el mismo.
fuente
conv=notrunc
es necesario?gzip -c file | dd of=file
parece funcionar igual de bien.gzip
. Ej. ) Escriba más bytes de encabezado y datos que los bytes de datos originales, sobrescribiendo así algunas partes del archivo? Supongo que esto depende del programa de compresión elegido. ¿Alguien tiene una idea de cómo evitar que esto suceda o cuán (im) probable es?No es tanto eso
gzip
ybzip2
sobrescribir el original. Por el contrario, escriben los datos comprimidos en el disco como un nuevo archivo, y si esa operación tiene éxito, desvinculan el archivo original sin comprimir.Si tiene suficiente RAM, puede escribir un script para comprimir temporalmente los archivos en un
tmpfs
sistema de archivos, luego eliminar el original en el disco y reemplazarlo con la versión comprimida. Tal vez algo como esto:Solo tenga en cuenta su uso de memoria, ya que
tmpfs
es esencialmente un disco RAM. Un archivo de salida grande podría matar de hambre fácilmente al sistema y causarle otros problemas.fuente
No existe una herramienta que funcione de esta manera, precisamente por la razón que da. Pocas personas están dispuestas a escribir una herramienta que implemente deliberadamente comportamientos riesgosos.
fuente
Los comandos split y csplit podrían usarse para dividir el archivo grande en partes más pequeñas y luego comprimirlos individualmente. Sin embargo, volver a ensamblar llevaría bastante tiempo.
fuente