Totalement patchwork et une esquisse rapide et approximative, mais testée sur un répertoire de 3000 fichiers, le script ci-dessous a fait un travail extrêmement rapide:
#!/usr/bin/env python3
import subprocess
import os
import sys
splitinto = 2
dr = sys.argv[1]
os.chdir(dr)
files = os.listdir(dr)
n_files = len(files)
size = n_files // splitinto
def compress(tar, files):
command = ["tar", "-zcvf", "tarfile" + str(tar) + ".tar.gz", "-T", "-", "--null"]
proc = subprocess.Popen(command, stdin=subprocess.PIPE)
with proc:
proc.stdin.write(b'\0'.join(map(str.encode, files)))
proc.stdin.write(b'\0')
if proc.returncode:
sys.exit(proc.returncode)
sub = []; tar = 1
for f in files:
sub.append(f)
if len(sub) == size:
compress(tar, sub)
sub = []; tar += 1
if sub:
# taking care of left
compress(tar, sub)
Comment utiliser
les .tar.gz
fichiers numérotés seront créés dans le même répertoire que celui où se trouvent les fichiers.
Explication
Le scénario:
- répertorie tous les fichiers du répertoire
- cd dans le répertoire pour éviter d'ajouter les informations de chemin au fichier tar
- lit la liste des fichiers en les regroupant par division définie
- compresse le ou les sous-groupes dans des fichiers numérotés
ÉDITER
Créer automatiquement des morceaux par taille en Mo
Plus sophistiqué consiste à utiliser la taille maximale (en mb) des morceaux comme un (deuxième) argument. Dans le script ci-dessous, les morceaux sont écrits dans un fichier compressé dès que le morceau atteint (dépasse) le seuil.
Étant donné que le script est déclenché par les blocs, dépassant le seuil, cela ne fonctionnera que si la taille de (tous) les fichiers est sensiblement inférieure à la taille du bloc.
Le scénario:
#!/usr/bin/env python3
import subprocess
import os
import sys
dr = sys.argv[1]
chunksize = float(sys.argv[2])
os.chdir(dr)
files = os.listdir(dr)
n_files = len(files)
def compress(tar, files):
command = ["tar", "-zcvf", "tarfile" + str(tar) + ".tar.gz", "-T", "-", "--null"]
proc = subprocess.Popen(command, stdin=subprocess.PIPE)
with proc:
proc.stdin.write(b'\0'.join(map(str.encode, files)))
proc.stdin.write(b'\0')
if proc.returncode:
sys.exit(proc.returncode)
sub = []; tar = 1; subsize = 0
for f in files:
sub.append(f)
subsize = subsize + (os.path.getsize(f)/1000000)
if subsize >= chunksize:
compress(tar, sub)
sub = []; tar += 1; subsize = 0
if sub:
# taking care of left
compress(tar, sub)
Courir:
python3 /path/tocompress_split.py /directory/with/files/tocompress chunksize
... où chunksize est la taille d' entrée de la commande tar.
Dans celui-ci, les améliorations suggérées par @DavidFoerster sont incluses. Merci beaucoup !
tar
les ajouter en ajoutant tous les fichiers en commençant par un certain modèle jusqu'à ce que vous les ayez tous. Cela peut être facilement scripté mais ne garantit pas que la taille sera inférieure à 9 Mo selon vos besoins. Vous pouvez cependant ajuster manuellement la taille de ces fichiers trop volumineux en les divisant davantage.