¿Cómo combinar / fusionar archivos zip?

21

Durante los últimos meses, he copiado varias carpetas de datos en archivos zip a intervalos semanales. Ahora me gustaría combinar esos archivos zip en un archivo zip, porque la mayoría de los contenidos de los archivos zip existentes son solo versiones diferentes de los mismos archivos de datos.

Entonces, si un archivo aparece en más de uno de los archivos zip existentes, me gustaría que la versión más nueva esté en el nuevo archivo zip que se está creando. Por supuesto, si un archivo aparece en un solo archivo zip existente, también lo quiero en el archivo zip final.

Estoy tratando de evitar tener que descomprimirlos uno por uno en una carpeta de trabajo, sobrescribiendo datos de archivos zip más antiguos con datos de archivos zip más nuevos y luego volviendo a comprimir todo en un nuevo archivo zip.

Por lo que entiendo, pkzip combinaría los archivos zip ellos mismos, pero ¿hay algún método gratuito confiable y rápido que alguien pueda contarme?

CChriss
fuente
1
zipmerge para la victoria
Code Bling

Respuestas:

7

no le gustará pero: descomprimir todo en una carpeta de trabajo en el orden correcto, luego comprimir el resultado es la forma más efectiva.

de lo contrario, terminará con muchos ciclos de CPU desperdiciados:

  • suponga que su resultado va a 'first.zip'
  • cada archivo de '2.zip', '3.zip', etc. debe descomprimirse y luego comprimirse nuevamente en 'first.zip'
  • en '2.zip' existe un archivo 'foobar.txt' y en '3.zip' existe otro archivo 'foobar.txt'. fusionarlo de la manera que desea fusionarlo lleva a 'comprimirlo X veces'
  • el toc de un .zip está al final del archivo: agrega más contenido (a la mitad del
    .zip actualizando un archivo en el medio) y el archivo completo tiene que reescribirse

entonces, en mi humilde opinión, solo use ' descomprimir ' wiseley:

% mkdir all
% for x in *.zip ; do unzip -d all -o -u $x ; done
% zip -r all.zip all

el orden de descompresión es importante, no conozco el patrón de sus nombres zip, pero primero extraería el archivo zip más nuevo, la opción '-u' de descomprimir sobrescribe solo archivos si son más nuevos o crea archivos si no Ya ahí. Como resultado, descomprimirá solo los archivos más nuevos y comprimirá el resultado solo una vez.

akira
fuente
Esto podría ser más efectivo desde la perspectiva del usuario, pero no es preciso. La tabla de archivos en un zip está de hecho al final, pero puede escribir arbitrariamente archivos al final de cualquier zip y luego escribir una nueva tabla de archivos. El último registro siempre gana. Aquellos con un poco de familiaridad con las secuencias de comandos o la programación podrían hacer todo este proceso sin descomprimir ni comprimir ningún archivo simplemente moviendo los fragmentos binarios y actualizando la tabla zip.
caesay
De hecho, puede concatenar todos los archivos zip en un solo archivo (en el orden que desee) y luego escribir un nuevo registro de archivo al final para incluir solo las últimas versiones de los archivos. Esto tiene el beneficio adicional de que el archivo zip todavía contiene todas las versiones anteriores de archivos que se pueden recuperar si es necesario
caesay
"todos los archivos de '2.zip', '3.zip', etc. deben descomprimirse y luego comprimirse nuevamente en 'first.zip'" no es correcto. La zipmergeutilidad combina archivos ZIP sin descomprimir y volver a comprimir, por ejemplo.
ZachB
Usé unzipping/ zippingy no uncompress / decompress. Sí, obviamente, uno puede tomar una entrada de 2.zip(el blob comprimido) y transferirlo first.zipy, por lo tanto, no debe producirse "compresión". Pero debe extraer el blob de 2.zip, buscar la existencia en la tabla de contenido de first.zip, si está allí, reemplazar la entrada existente (lo que significa que básicamente tiene que reescribir todo el archivo) o agregarla al final, y después de eso necesita agregue el toc de la cremallera. No veo cómo se zipmergepuede lograr la fusión de las entradas zip de una manera diferente (compresión aparte)
akira
-1 porque hay formas mucho más eficientes de hacer esta tarea, y ninguna de las justificaciones para que esta sea "la forma más efectiva" tiene el más mínimo sentido. every file [...] has to be unzipped and then zipped again- No, eso es lo que hace tu solución. in '2.zip' exists a file 'foobar.txt' and in '3.zip' exists another file 'foobar.txt'. merging it the way you want to merge it leads to 'compress it X times'No, no lo hace. ¿Por qué lo haría? you add more content [...] and the whole file has to be rewritten- No, escribe la salida en una pasada. ¿Por qué alguien votó esto?
benrg
4

Simplemente use la opción -g de ZIP, donde puede agregar cualquier número de archivos ZIP en uno (sin extraer los antiguos). Esto te ahorrará mucho tiempo.

También eche un vistazo a zipmerge

Christos
fuente
44
-gagrega archivos a un zip existente. No los fusiona. por ejemplo: zip -g result.zip other.zipagregará el archivo other.zipen result.zip . --grow Crecerá ( agregará) el archivo zip especificado, en lugar de crear uno nuevo. Si esta operación falla, zip intenta restaurar el archivo a su estado original. Si la restauración falla, el archivo podría corromperse. Esta opción se ignora cuando no hay archivo existente o cuando al menos un miembro del archivo debe ser actualizado o deleted.`
Akira
2

https://linux.die.net/man/1/zipmerge :

zipmerge combina los archivos zip de origen source-zipen el archivo zip de destino target-zip. Por defecto, los archivos en los archivos zip de origen sobrescriben los archivos existentes del mismo nombre en el archivo zip de destino.

imz - Ivan Zakharyaschev
fuente
1

Estaba pensando que podría escribir los archivos que se extraen en un directorio temporal.

Hay un problema con esta línea de comando. No pude encontrar una manera de ordenar la descompresión de los archivos, por lo que un archivo antiguo puede sobrescribir un archivo nuevo. Este problema puede resolverse mediante el uso de un descomprimidor que tiene un interruptor de línea de comando para sobrescribir solo si es más reciente. Principalmente uso 7-Zip, que no tiene esa opción de línea de comando.

Además, este comando necesita que todos los archivos zip estén en el mismo directorio. No es un problema si todas las cremalleras tienen nombres únicos. Dicho esto, el comando se puede cambiar para adaptarse a su situación.

for /f %f in ('dir /b *.zip') do "c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoa

Para cambiar esto para usar otro programa de descompresión, simplemente reemplace "c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoacon cualquier comando que ejecute en cada archivo. Úselo %fcomo marcador de posición para el nombre del archivo que desea descomprimir.

Intenté buscar una aplicación pulida, gratuita o no, y realmente no encontré una.

Con suerte, esto le dará un buen comienzo y WinZip o algo similar puede solucionar el problema de sobrescritura.

Buena suerte.

Scott McClenning
fuente
0

Si no recuerdo mal , pkzip era un programa de línea de comandos.

Todavía hay una versión de ZIP de línea de comandos que dice ser compatible con pkzip.

Se llama Info-ZIP y debe haber una versión para su sistema operativo.

pavium
fuente
¿Tiene la funcionalidad que estoy preguntando? No puedo encontrar dónde enumera esta habilidad.
CChriss
1
El paquete Info-Zip hace que los archivos sean compatibles con PKZip, pero los programas en sí mismos son diferentes y no parecen incluir una opción de combinación.
CarlF
OK, lo siento, pude compilar y ejecutar Info-Zip en una estación de trabajo Apollo en DOMAIN / OS hace muchos años. Recuerdo que proporcionó diferentes características en DOS / VMS / Unix y algunas otras, incluso entonces. Supongo que puede haber evolucionado más.
Pavium el
0

Busque la línea de comando winzip en la red. Winzip tiene varias versiones de herramientas de línea de comandos para adaptarse a cualquier versión de winzip que pueda haber instalado. La herramienta de línea de comandos WZZIP tiene una opción -f "refrescar" que comprimirá los archivos más nuevos solo de aquellos que coincidan con el nombre de un archivo en el archivo zip de salida de suma.

Use WZunzip envuelto en una declaración FOR como se muestra arriba para descomprimir un archivo en un directorio y luego WZzip -f para agregar esos archivos a un archivo zip de suma de salida. Luego, el bucle FOR se repite para trabajar en el siguiente archivo de entrada para generar el único archivo de salida de suma. El orden de los archivos de entrada no importa, ya que WZzip -f solo se agregará al archivo de salida si los datos de entrada son más nuevos de lo que ya está en el archivo de salida. Todos los archivos que no existen en el archivo de salida también se agregarán. Luego puede descomprimir el resultado en una carpeta y luego comprimirlo nuevamente para obtener un archivo de resultados empaquetado de manera eficiente. Incluso puede hacer esto automáticamente después del bucle FOR al final del archivo por lotes.

eewiz
fuente