Comprime muchos archivos en varios archivos

13

Ejecutando Linux. Tengo un directorio de alrededor de 150 grandes archivos CSV; simplemente hacer una zip -9en ellos da como resultado un archivo monolítico que todavía es demasiado grande. Me gustaría simplemente comprimirlos en tal vez cuatro o cinco archivos zip de 30-40 CSV cada uno; de esta manera, la secuencia o el orden postal expandido no será un problema, ya que cada código postal es independiente. Debe haber una manera simple de hacer esto. ¿Alguna sugerencia?

(y sí, zip es el formato preferido, si es posible)

Mundos sin fin
fuente

Respuestas:

23

¿No es suficiente el interruptor? Puede usar zip -s para dividir el archivo en archivos de tamaño máximo, por ejemplo:

"zip -s 300m <archivo de 2 gb>" produce:

file.zip (300 mb, master file)
file.001.zip (300 mb)
file.002.zip (300 mb)
file.003.zip (300 mb)
file.004.zip (300 mb)
file.005.zip (300 mb)
file.006.zip (200 mb)

Entonces "descomprimir archivo.zip" descomprimirá todo junto.

ranisalt
fuente
¿Qué versión de zip es esta? Obtengo file.z01 file.z02 ... file.zip y unzip file.zipno funciona directamente (usaría zip -F para recombinarlos primero). Tenga en cuenta que estos no son "independientes" según lo solicitado.
sourcejedi
1
@sourcejedi: En esta respuesta ( superuser.com/a/602736/195224 ) hay algunas explicaciones más detalladas.
mpy
@mpy Lo sé, acabo de escribir esa respuesta :).
sourcejedi
@sourcejedi: Oh, sí, ahora lo dices ...;)
mpy
2

Usar split en la lista de archivos de entrada :-).

(No probado, he incluido comandos rm para limpieza, tenga cuidado).

ls *.csv > csvfiles
split -d -l30 - csvfiles < csvfiles
for i in csvfiles[0-9][0-9]; do
  zip "$i.zip" -@ < "$i"
done

rm csvfiles
rm csvfiles[0-9][0-9]
sourcejedi
fuente
¿Por qué usas split -C( --line-bytes) y no split -l( --lines)? Eso sería más predecible, con respecto a cuántos archivos CSV hay en un archivo.
mpy
Leí la página del manual demasiado rápido. ¡Gracias, lo arreglaré!
sourcejedi