web-dev-qa-db-fra.com

Comment compresser des fichiers avec une taille limite?

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?

23
Vishnu

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 "):

(...)

Une utilisation des archives fractionnées consiste à stocker une grande archive sur plusieurs suppressions
support capable. Pour une archive divisée avec 20 fichiers divisés, les fichiers sont typés
iquement nommé (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
est actuellement l'un des k (kilo-octets), m (mégaoctets), g (gigaoctets),
ou t (téraoctets). Comme 64k est la taille minimale de partage, les nombres
sans multiplicateurs par défaut en mégaoctets. Par exemple, pour créer
a mangé une archive divisée appelée foo avec le contenu de la barre
répertoire 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é.

Donc, pour créer une archive Zip divisée, vous pouvez faire ce qui 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 page de manuel "Zip" 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 devez d'abord "dissocier" 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

22
ricmarques
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 -
8
Henrik Carlqvist

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 fichiers de 1 Go pour copier sur un FAT32 USB (nom de fichier "FIVE_GB_FILE.ISO")

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

Zip -0 FIVE_GB_FILE.Zip FIVE_GB_FILE.ISO

Étape 2: divisez 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
3
Jay Marm