¿Cómo descomprimir un ZIP multiparte (extendido) en Linux?


74

Necesito cargar un archivo de 400mb en mi servidor web, pero estoy limitado a cargas de 200mb. Mi anfitrión sugirió que usara un archivo extendido, que nunca había hecho en Linux.

He creado una prueba en su propia carpeta, cerrando la cremallera de un PDF en test.zip.001, .002, y .003. ¿Cómo hago para descomprimirlo? ¿Necesito unirme a ellos primero?

Tenga en cuenta que estaría tan feliz usando 7z como estoy usando formatos ZIP. Si esto hace alguna diferencia en el resultado.


Esto puede no ser útil en un servidor web con software limitado instalado, pero no he visto esta solución en ningún otro lado y es lo que uso: la API java.util.zip se ha ocupado de todas las partes ZIP que le he lanzado , incluso en el caso más general de no tener partes finales o que la última parte esté incompleta. Lo llamo desde Jython, por lo que tiene la forma de un script, y aquí está el código: github.com/combatopera/unzipparts
Andrzej Cichocki

Respuestas:


75

Tendrás que unirte a ellos primero. Puede usar la aplicación de Linux común, catcomo en el ejemplo a continuación:

cat test.zip* > ~/test.zip

Esto concatenar todas sus test.zip.001, test.zip.002, etc archivos en uno grande, archivo test.zip. Una vez que tenga ese archivo único, puede ejecutarunzip test.zip

"Cómo crear, dividir, unir y extraer archivos zip en Linux" puede ayudar.


1
OK, me gusta eso ... Progreso ... Pero realmente soy un Linux n00b aquí. Supongo que x*es el nombre de archivo? ¿Y ~/hugefilees un directorio? ¿Cuál es el propósito del símbolo tilde? Lamento preguntar lo que sospecho son preguntas muy básicas.
Tim

cuando divide los archivos, debe usar un prefijo como x_ (ej: x_split1, x_split2, ...; como los sufijos de Windows file.001, file.002 ... etc.) la tilde representa su directorio de inicio. ~ / hugefile es lo mismo que / home / tim / hugefile. ¿dividiste tus archivos? ¿Cuáles son los nombres de los archivos divididos?
fromnaboo

1
Creo que veo dónde entrará el problema, el archivo Spanned se creó en Windows, usando 7zip con una extensión ZIP, por lo que se crea automáticamente como TEST.zip.001, TEST.zip.002y lo TEST.zip.003que significa que la división es muy diferente. Está empezando a parecer que puede ser más fácil lanzar Linux en un VMWare y crear los archivos aquí, entonces al menos solo estoy tratando con 1 SO. ¿Se puede usar el comando SPLIT en CUALQUIER tipo de archivo? es decir, imágenes, películas de audio, etc.
Tim

Sí, el comando dividir funciona en cualquier archivo. instale p7zip con apt-get instale p7zip en debian o yum instale p7zip en fedora, una los archivos con: cat TEST.zip. *> archive y extráigalos con.
fromnaboo

1
7za x archiveprobablemente sea mejor si el archivo contiene una estructura de directorio.
slm

38

La unziputilidad Linux realmente no es compatible con cremalleras multiparte. Del manual :

Los archivos de varias partes aún no son compatibles, excepto en combinación con zip. (Todas las partes deben concatenarse juntas en orden, y luego zip -F (para zip 2.x) o zip -FF(para zip 3.x) deben realizarse en el archivo concatenado para "arreglarlo". Además, zip 3.0 y posterior pueden combinarse archivos de varias partes (divididos) en un archivo combinado de un solo archivo usando zip -s- inarchive -O outarchive. Consulte la página del manual de zip 3 para obtener más información).

Por lo tanto, primero debe concatenar las piezas y luego reparar el resultado. cat test.zip.*concatena todos los archivos llamados test.zip.*donde el comodín *representa cualquier secuencia de caracteres; Los archivos se enumeran en orden lexicográfico, que es lo mismo que el orden numérico gracias a los ceros iniciales. >test.zipdirige la salida al archivo test.zip.

cat test.zip.* >test.zip
zip -FF test.zip --out test-full.zip
unzip test-full.zip

Si creó las piezas dividiendo directamente el archivo zip, en lugar de crear un zip de varias partes con la utilidad oficial Pkzip, todo lo que necesita hacer es unir las partes.

cat test.zip.* >test.zip
unzip test.zip

1
el segundo comando debe ser zip -FF test.zip --out test-full.zip - le dará un error sin el comando --out
Alvin

3
Para mí, el FFenfoque funcionó si señalaba zipel primer archivo de varias partes, no es catnecesario.
Jānis Elmeris

1
Como @ JānisElmeris ya mencionó, no es necesario concatenar los archivos antes zip -FFde usarlos.
René

24
7z x archive.zip.001

Encontrará automáticamente el resto


1
Eso es tan extraño ... Para que esto funcione, primero debe cambiar el nombre de todos los archivos ZIP (.zXX y .zip) a .zip.xxx (.zip es la última parte), luego puede usar 7z x en el primero , que se "extrae" en un zip concatenado que luego puede descomprimirse nuevamente usando descomprimir pero no 7z ... No estoy completamente seguro de si el archivo se descomprimió correctamente, pero al menos esta vez descomprimir no compila los errores de CRC. . ZIP está increíblemente roto en Linux, evítalo si puedes. :(
Energiequant

al menos para centos, también necesitamos instrucciones sobre cómo instalar 7z
stiv

20

Encontré la respuesta aquí: https://superuser.com/a/517758/10264

Esta respuesta es similar en concepto a la de Gilles , es decir, primero combina el archivo dividido en un archivo normal usando división, y luego lo descomprime usando descomprimir.

La diferencia es que, en lugar de usar la -FFbandera, que no funcionó para mí, simplemente le dice a zip que vuelva a empaquetar el archivo dividido sin dividirlo. Eso es lo -s 0que significa la bandera.

Entonces, primero, combine el archivo dividido en un solo archivo:

zip -s 0 split-foo.zip --out unsplit-foo.zip

Luego, extraiga el archivo único usando descomprimir:

unzip unsplit-foo.zip

2
Esta es la respuesta correcta para zip 3.x
texasbruce

0

Solo otro ejemplo. Esto funcionó para mí en bash para dividir el instalador Oracle de 3 GB:

echo "<installOracleDB.sh>: Splitting OracleDB installer"
zip /tmp/linuxx64_12201_database.zip --out /tmp/linuxx64_12201_oradb.zip -s 1000m
echo "<installOracleDB.sh>: Merging OracleDB installer"
zip -FF /tmp/linuxx64_12201_oradb.zip --out /tmp/linuxx64_12201_database.zip
echo "<installOracleDB.sh>: Removing temporary files OracleDB installer"
find /tmp -type f -name 'linuxx64_12201_oradb*' -exec rm {} +
echo "<installOracleDB.sh>: Unizipping OracleDB installer"
unzip /tmp/linuxx64_12201_database.zip

Esto se ve muy similar a las respuestas anteriores. ¿Puede explicar qué está haciendo y cómo difiere de lo que ya se ha publicado? Por favor no responda en los comentarios; edite su respuesta para que sea más clara y completa.
Scott

Hola Scot, desearía poder responder en los comentarios, pero tengo algunos pequeños puntos para hacerlo ahora. Esta respuesta proporciona una lista completa de comandos para dividir, fusionar y descomprimir un archivo grande en Unix. Proporcionaré más textos explicativos para aclarar mi respuesta. Gracias por su respuesta.
TheHagueCoder

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.