150 votes

Fractionnement de fichiers à l'aide de tar, gz, zip ou bzip2

Je dois compresser un gros fichier d'environ 17 à 20 Go. Je dois le diviser en plusieurs fichiers d'environ 1 Go chacun.

J'ai cherché une solution via Google et j'ai trouvé des moyens utilisant split y cat commandes. Mais elles n'ont pas du tout fonctionné pour les gros fichiers. De plus, elles ne fonctionnent pas sous Windows ; j'ai besoin de l'extraire sur une machine Windows.

3 votes

Je ressens votre douleur mais cela ne semble pas être lié à la programmation.

1 votes

De nombreux programmes de compression (par exemple, 7-Zip) sont capables de diviser le fichier compressé en volumes d'une taille donnée pour faciliter la distribution.

0 votes

Cela appartient à superuser.com, mais la bêta privée ne commence pas avant demain, m'a-t-on dit.

263voto

sirlancelot Points 5896

Vous pouvez utiliser le split avec la commande -b option :

split -b 1024m file.tar.gz

Il peut être réassemblé sur une machine Windows en utilisant @ Joshua La réponse de la Commission.

copy /b file1 + file2 + file3 + file4 filetogether

Editar : Comme @Charlie l'a indiqué dans le commentaire ci-dessous, vous pourriez vouloir définir un préfixe explicitement parce qu'il utilisera x autrement, ce qui peut prêter à confusion.

split -b 1024m "file.tar.gz" "file.tar.gz.part-"

// Creates files: file.tar.gz.part-aa, file.tar.gz.part-ab, file.tar.gz.part-ac, ...

Editar : Modification du message car la question est fermée et la solution la plus efficace est très proche du contenu de cette réponse :

# create archives
$ tar cz my_large_file_1 my_large_file_2 | split -b 1024MiB - myfiles_split.tgz_
# uncompress
$ cat myfiles_split.tgz_* | tar xz

Cette solution évite d'avoir à utiliser un gros fichier intermédiaire lors de la (dé)compression. Utilisez l'option tar -C pour utiliser un répertoire différent pour les fichiers résultants. btw si l'archive ne consiste qu'en un seul fichier, tar peut être évité et seul gzip peut être utilisé :

# create archives
$ gzip -c my_large_file | split -b 1024MiB - myfile_split.gz_
# uncompress
$ cat myfile_split.gz_* | gunzip -c > my_large_file

Pour Windows, vous pouvez télécharger des versions portées des mêmes commandes ou utiliser cygwin.

7 votes

Si vous n'ajoutez pas un préfixe comme dernier argument après le nom du fichier à diviser, vous obtiendrez une sortie dans des fichiers nommés xaa, xab, xac, xad.....

0 votes

@Charlie, merci, j'ai mis à jour ma réponse.

3 votes

En fait, l'utilisation -b 1024MiB a donné une erreur indiquant qu'il s'agissait d'un nombre d'octets invalide. Utilisation de --bytes=1024m travaux.

28voto

Joshua Points 13231

Si vous vous séparez de Linux, vous pouvez toujours vous réassembler dans Windows.

copy /b file1 + file2 + file3 + file4 filetogether

1 votes

Vous pouvez également utiliser copy /b file* filetogether -- support.microsoft.com/kb/71161

5 votes

Cela ne fonctionne correctement que sur NTFS et si les fichiers sont déjà dans l'ordre de tri NTFS. Essayez-le sur FAT ou FAT32 = boom.

0 votes

+1 assurez-vous que les fichiers sont dans le bon ordre !

10voto

Tim Hoolihan Points 6982

Utiliser tar pour divisé en plusieurs archives

il existe de nombreux programmes qui fonctionnent avec les fichiers tar sous Windows, y compris cygwin.

8voto

Adrian Panasiuk Points 3863

Code testé, crée initialement un seul fichier d'archive, puis le divise :

 gzip -c file.orig > file.gz
 CHUNKSIZE=1073741824
 PARTCNT=$[$(stat -c%s file.gz) / $CHUNKSIZE]

 # the remainder is taken care of, for example for
 # 1 GiB + 1 bytes PARTCNT is 1 and seq 0 $PARTCNT covers
 # all of file
 for n in `seq 0 $PARTCNT`
 do
       dd if=file.gz of=part.$n bs=$CHUNKSIZE skip=$n count=1
 done

Cette variante ne crée pas de fichier d'archive unique et passe directement à la création de pièces :

gzip -c file.orig |
    ( CHUNKSIZE=1073741824;
        i=0;
        while true; do
            i=$[i+1];
            head -c "$CHUNKSIZE" > "part.$i";
            [ "$CHUNKSIZE" -eq $(stat -c%s "part.$i") ] || break;
        done; )

Dans cette variante, si la taille du fichier de l'archive est divisible par $CHUNKSIZE alors le dernier fichier partiel aura une taille de 0 octet.

1 votes

C'est ce que split le fait déjà.

1 votes

Ephemient Hey, j'ai creusé quelques post en cherchant juste POUR ÇA. Je n'ai pas de commandes/binaires split ou zip sur un certain appareil, et celui-ci a parfaitement fonctionné. Je vais préparer ce code pour qu'il fonctionne comme une commande split :). Merci beaucoup @Adrian Panasiuk. C'est parfait pour moi.

0 votes

@erm3nda De rien, content que ça aide !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X