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?
Respuestas:
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:
.zip actualizando un archivo en el medio) y el archivo completo tiene que reescribirse
entonces, en mi humilde opinión, solo use ' descomprimir ' wiseley:
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.
fuente
zipmerge
utilidad combina archivos ZIP sin descomprimir y volver a comprimir, por ejemplo.unzipping
/zipping
y nouncompress / decompress
. Sí, obviamente, uno puede tomar una entrada de2.zip
(el blob comprimido) y transferirlofirst.zip
y, por lo tanto, no debe producirse "compresión". Pero debe extraer el blob de2.zip
, buscar la existencia en la tabla de contenido defirst.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 sezipmerge
puede lograr la fusión de las entradas zip de una manera diferente (compresión aparte)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?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
fuente
-g
agrega archivos a un zip existente. No los fusiona. por ejemplo:zip -g result.zip other.zip
agregará el archivoother.zip
en 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.`Puede que no sea lo que está buscando, pero la herramienta gratuita de compilación Ant incluye la capacidad de fusionar archivos Zip.
https://ant.apache.org/manual/Tasks/zip.html
fuente
https://linux.die.net/man/1/zipmerge :
fuente
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 -aoa
con cualquier comando que ejecute en cada archivo. Úselo%f
como 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.
fuente
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.
fuente
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.
fuente