Come comprimere i file con un limite di dimensioni?


19

Ho uno script che comprime i file da una cartella. Voglio assicurarmi che il file zippato non superi i 10 MB. Se la dimensione è superiore a 10 MB, dovrebbe creare un altro file ZIP.

C'è qualche comando (o altro metodo) che può essere usato per questo?


1
La domanda ha il tag gzip ma il testo si riferisce a zip , puoi chiarire? (Le risposte sono divise tra approcci basati sui diversi formati.)
Håkan Lindqvist,

Non posso aggiungere zip al tag, ecco perché ho usato gzip, se hai un metodo gzip che posso adattarmi a questo problema, posso usare anche quello.
Vishnu,

Risposte:


21

È possibile utilizzare la funzionalità " dividi archivio " di " zip " stessa utilizzando l' opzione " --split-size ".

Dalla manpage "zip" (" man zip"):

(...)

Un uso di archivi divisi è l'archiviazione di un archivio di grandi dimensioni su più
supporti rimovibili . Per un archivio diviso con 20 file divisi, i file sono tipicamente
denominati (sostituire ARCHIVE con il nome del proprio archivio) AR‐
CHIVE.z01, ARCHIVE.z02, ..., ARCHIVE.z19, ARCHIVE.zip. Si noti che l'
ultimo file è il file .zip.

(...)

-s splitsize
--split-size splitsize

La dimensione della divisione è un numero facoltativamente seguito da un moltiplicatore.
Attualmente il numero deve essere un numero intero. Il moltiplicatore può
attualmente essere uno di k (kilobyte), m (megabyte), g (gigabyte)
o t (terabyte). Poiché 64k è la dimensione minima suddivisa, i numeri
senza moltiplicatori vengono impostati su megabyte. Ad esempio, per creare
un archivio diviso chiamato pippo con il contenuto della
directory della barra con divisioni di 670 MB che potrebbero essere utili per la masterizzazione
su CD, il comando:

                zip -s 670m -r foo bar

potrebbe essere usato.

Quindi, per creare un archivio zip diviso , è possibile effettuare le seguenti operazioni (l' -ropzione "" è l'opzione "ricorsiva" per includere le sottodirectory della directory):

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

Per decomprimere il file , la " zip" manpage spiega che dovresti usare l'opzione "-s 0`":

(...)

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

convertirà un archivio diviso in un archivio a file singolo.

(...)

Quindi, prima devi "annullare la divisione" del file ZIP usando l'opzione "-s 0":

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

... e poi decomprimere il file unsplit:

$ unzip unsplit.zip


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

Ti darà un numero di file:

archive.tar.gzaa

archive.tar.gzab

...

Che quindi può essere decompresso con:

cat archive.tar.* | tar -xzvf -

2

Ecco come l'ho fatto per un file da 5 GB (suddiviso in 1 GB contro 10 MB come richiesto da OP) ...

Esempio: per dividere un file da 5 GB in file da 1 GB da copiare su un USB FAT32 (nome file "FIVE_GB_FILE.ISO")

Passaggio 1: zip il file (nessuna compressione, stessa directory del sorgente)

zip -0 FIVE_GB_FILE.ZIP FIVE_GB_FILE.ISO

Passaggio 2 : dividere il file zip da 5 GB in file zip da 1 GB

zip -s 1000m SPLIT_5GB_FILES FIVE_GB_FILE.ZIP

Voilà ... dovresti avere i seguenti file da 1 GB (E l'originale E lo zip dal passaggio 1)

SPLIT_5GB_FILES.zip
SPLIT_5GB_FILES.Z01
SPLIT_5GB_FILES.Z02
SPLIT_5GB_FILES.Z03
SPLIT_5GB_FILES.Z04
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.