¿Cómo comprimir archivos con un límite de tamaño?

19

Tengo un script que comprime archivos de una carpeta. Quiero asegurarme de que el archivo comprimido no tenga más de 10 MB. Si el tamaño es superior a 10 MB, debería crear otro archivo ZIP.

¿Hay algún comando (u otro método) que pueda usarse para esto?

Vishnu
fuente
1
La pregunta tiene la etiqueta gzip pero el texto hace referencia a zip , ¿puedes aclarar? (Las respuestas se dividen entre enfoques basados ​​en los diferentes formatos).
Håkan Lindqvist
No puedo agregar zip a la etiqueta por eso utilicé gzip. Si tiene un método gzip que pueda encajar con este problema, también puedo usarlo.
Vishnu

Respuestas:

21

Puede usar la funcionalidad de " archivo dividido " de " zip " en sí usando la opción " --split-size ".

Desde la página de manual "zip" (" man zip"):

(...)

Un uso de los archivos divididos es almacenar un archivo grande en múltiples
medios extraíbles . Para un archivo dividido con 20 archivos divididos, los archivos se denominan típicamente
(reemplace ARCHIVE con el nombre de su archivo) AR‐
CHIVE.z01, ARCHIVE.z02, ..., ARCHIVE.z19, ARCHIVE.zip. Tenga en cuenta que el
último archivo es el archivo .zip.

(...)

-s splitsize
--split-size splitsize

El tamaño dividido es un número seguido opcionalmente por un multiplicador.
Actualmente el número debe ser un número entero. El multiplicador
actualmente puede ser uno de k (kilobytes), m (megabytes), g (gigabytes)
o t (terabytes). Como 64k es el tamaño mínimo de división, los números
sin multiplicadores predeterminan a megabytes. Por ejemplo, para crear
un archivo dividido llamado foo con los contenidos del
directorio de barras con divisiones de 670 MB que podrían ser útiles para grabar
en CD, el comando:

                zip -s 670m -r foo bar

puede ser usado.

Entonces, para crear un archivo zip dividido , puede hacer lo siguiente (" -r" es el interruptor "recursivo" para incluir subdirectorios del directorio):

$ zip -r -s 10m archive.zip directory/

Para descomprimir el archivo , la página de zipmanual " " explica que debe usar el modificador "-s 0`":

(...)

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

convertirá un archivo dividido en un archivo de un solo archivo.

(...)

Entonces, primero "desdobla" el archivo ZIP con el interruptor "-s 0":

$ zip -s 0 archive.zip --out unsplit.zip

... y luego descomprimes el archivo no dividido:

$ unzip unsplit.zip

ricmarques
fuente
6
tar -czvf - /path/to/files | split -b 10M - archive.tar.gz

Le dará una cantidad de archivos:

archive.tar.gzaa

archive.tar.gzab

...

Que luego se puede descomprimir con:

cat archive.tar.* | tar -xzvf -
Henrik Carlqvist
fuente
2

Así es como lo hice para un archivo de 5GB (dividido en 1GB frente a 10MB como OP pidió) ...

Ejemplo: para dividir un archivo de 5GB en archivos de 1GB para copiar a un USB FAT32 (nombre de archivo "FIVE_GB_FILE.ISO")

Paso 1: comprime el archivo (sin compresión, el mismo directorio que la fuente)

zip -0 FIVE_GB_FILE.ZIP FIVE_GB_FILE.ISO

Paso 2 : divide el archivo zip de 5 GB en archivos zip de 1 GB

zip -s 1000m SPLIT_5GB_FILES FIVE_GB_FILE.ZIP

Voila ... debe tener los siguientes archivos de 1GB (Y el original, Y el zip del paso 1)

SPLIT_5GB_FILES.zip
SPLIT_5GB_FILES.Z01
SPLIT_5GB_FILES.Z02
SPLIT_5GB_FILES.Z03
SPLIT_5GB_FILES.Z04
Jay Marm
fuente