Fractionner les fichiers à l’aide de tar, gz, zip ou bzip2 [fermé]

144

J'ai besoin de compresser un gros fichier d'environ 17-20 Go. Je dois le diviser en plusieurs fichiers d'environ 1 Go par fichier.

J'ai cherché une solution via Google et trouvé des moyens d'utiliser splitet des catcommandes. Mais ils ne fonctionnaient pas du tout pour les gros fichiers. De plus, ils ne fonctionneront pas sous Windows; J'ai besoin de l'extraire sur une machine Windows.

Alias
la source
3
Je ressens votre douleur mais cela ne semble pas être lié à la programmation.
Jason S
1
De nombreux programmes de compression (par exemple 7-Zip) sont capables de diviser le fichier compressé en volumes d'une taille spécifiée pour une distribution plus facile.
Martin Liversage
Cela appartient à superuser.com, mais la bêta privée ne démarre que demain, me dit-on.
JesperE
Puis-je vous demander pourquoi vous avez besoin de ce fichier compressé?
Jan Jungnickel
Si l'une des deux solutions viables affichées ici ne fonctionne pas, il aura besoin d'une solution de programmation.
Joshua

Réponses:

253

Vous pouvez utiliser la splitcommande avec l' -boption:

split -b 1024m file.tar.gz

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

copy /b file1 + file2 + file3 + file4 filetogether

Edit : Comme @Charlie l'a indiqué dans le commentaire ci-dessous, vous voudrez peut-être définir un préfixe explicitement car il utilisera xautrement, ce qui peut être déroutant.

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, ...

Edit : Modifier le 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 se compose d'un seul fichier, tar pourrait être évité et seul gzip 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.

matpie
la source
7
si vous n'ajoutez pas de préfixe comme dernier argument après le nom de fichier à fractionner, vous obtenez une sortie dans des fichiers nommés xaa, xab, xac, xad ....
Charlie
@Charlie, merci, j'ai mis à jour ma réponse.
matpie
2
En fait, l'utilisation a -b 1024MiBdonné une erreur indiquant que le nombre d'octets était invalide. Utiliser des --bytes=1024mœuvres.
Brian
Et vous n'avez pas à utiliser catpour réassembler le fichier. Vous pouvez utiliser copy /b file1 + file2 + etc..sur Windows, puis recopier sur Linux et tar peut lire l'archive tar réassemblée. J'ai juste essayé.
Brian
1
Split a l'option --numeric-suffixes: utiliser des suffixes numériques au lieu de l'alphabet.
Dr.Jan-Philip Gehrcke
27

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

copy /b file1 + file2 + file3 + file4 filetogether
Joshua
la source
Vous pouvez également utiliser copy /b file* filetogether- support.microsoft.com/kb/71161
eug
5
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.
Joshua
+1 assurez-vous que les fichiers sont dans le bon ordre!
Brian
@Joshua Pour être honnête, si ce n'est pas le cas, vous avez mal nommé.
jpmc26
@ jpmc26: Vous connaissez les mauvaises habitudes de réorganisation des répertoires de FAT32, n'est-ce pas?
Joshua
8

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 omet de créer un seul fichier d'archive 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 fichier de 0 octet.

Adrian Panasiuk
la source
1
C'est ce que splitfait déjà.
éphémère
1
éphémère Hé, j'ai creusé un article à la recherche de CELA. 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 fractionnée :). Merci beaucoup @Adrian Panasiuk. C'est parfait pour moi.
m3nda
@ erm3nda Vous êtes les bienvenus, heureux que cela aide!
Adrian Panasiuk
Mais, j'ai testé et le résultat était un fichier complet, pas divisé. Comment est-ce possible? C'était un gros fichier sur un petit appareil, donc un long processus. Veuillez tester vos solutions lors de la publication :(
m3nda
@ erm3nda Vous ne nous avez jamais dit que vous deviez éviter de créer un fichier temporaire! Veuillez voir la deuxième variante!
Adrian Panasiuk