Comment compresser des fichiers avec une taille limite?

19

J'ai un script qui zippe les fichiers d'un dossier. Je veux m'assurer que le fichier compressé ne dépasse pas 10 Mo. Si la taille est supérieure à 10 Mo, il doit créer un autre fichier ZIP.

Y a-t-il une commande (ou une autre méthode) qui peut être utilisée pour cela?

Vishnu
la source
1
La question a la balise gzip mais le texte fait référence à zip , pouvez-vous clarifier? (Les réponses sont divisées entre les approches basées sur les différents formats.)
Håkan Lindqvist
Je ne peux pas ajouter de zip dans la balise, c'est pourquoi j'ai utilisé gzip, si vous avez une méthode gzip que je peux adapter à ce problème, je peux aussi l'utiliser.
Vishnu

Réponses:

21

Vous pouvez utiliser la fonctionnalité " split archive " de " zip " lui-même en utilisant l' option " --split-size ".

Depuis la page de manuel "zip" (" man zip"):

(...)

L'une des utilisations des archives fractionnées consiste à stocker une grande archive sur plusieurs
supports amovibles . Pour une archive divisée avec 20 fichiers divisés, les fichiers sont généralement
nommés (remplacez ARCHIVE par le nom de votre archive) AR‐
CHIVE.z01, ARCHIVE.z02, ..., ARCHIVE.z19, ARCHIVE.zip. Notez que le
dernier fichier est le fichier .zip.

(...)

-s splitsize
--split-size splitsize

La taille fractionnée est un nombre éventuellement suivi d'un multiplicateur.
Actuellement, le nombre doit être un entier. Le multiplicateur peut
actuellement être l'un de k (kilo-octets), m (mégaoctets), g (gigaoctets)
ou t (téraoctets). Comme 64 Ko est la taille de fractionnement minimale, les nombres
sans multiplicateurs par défaut sont des mégaoctets. Par exemple, pour créer
une archive fractionnée appelée foo avec le contenu du
répertoire bar avec des divisions de 670 Mo qui pourraient être utiles pour la gravure
sur CD, la commande:

                zip -s 670m -r foo bar

peut être utilisé.

Ainsi, pour créer une archive zip divisée , vous pouvez procéder comme suit (le " -r" est le commutateur "récursif" pour inclure les sous-répertoires du répertoire):

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

Pour décompresser le fichier , la zippage de manuel "" explique que vous devez utiliser le commutateur "-s 0`":

(...)

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

convertira une archive fractionnée en une archive à fichier unique.

(...)

Donc, vous "dissociez" d'abord le fichier ZIP en utilisant le commutateur "-s 0":

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

... et ensuite vous décompressez le fichier non divisé:

$ unzip unsplit.zip

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

Vous donnera un certain nombre de fichiers:

archive.tar.gzaa

archive.tar.gzab

...

Qui peut ensuite être décompressé avec:

cat archive.tar.* | tar -xzvf -
Henrik Carlqvist
la source
2

Voici comment je l'ai fait pour un fichier de 5 Go (divisé en 1 Go contre 10 Mo comme OP l'a demandé) ...

Exemple: Pour diviser un fichier de 5 Go en 1 Go de fichiers à copier sur un FAT32 USB (nom de fichier « FIVE_GB_FILE.ISO »)

Étape 1: compresser le fichier (pas de compression, même répertoire que la source)

zip -0 FIVE_GB_FILE.ZIP FIVE_GB_FILE.ISO

Étape 2 : diviser le fichier zip de 5 Go en fichiers zip de 1 Go

zip -s 1000m SPLIT_5GB_FILES FIVE_GB_FILE.ZIP

Voila ... vous devriez avoir les fichiers 1GB suivants (ET l'original ET le zip de l'étape 1)

SPLIT_5GB_FILES.zip
SPLIT_5GB_FILES.Z01
SPLIT_5GB_FILES.Z02
SPLIT_5GB_FILES.Z03
SPLIT_5GB_FILES.Z04
Jay Marm
la source