Je suis sur Ubuntu 16.04.
J'ai un dossier avec beaucoup de fichiers texte (presque 12k). Je dois tous les télécharger sur un site Web qui accepte les .tar.gz
téléchargements, puis les décompresse automatiquement, mais a une limite de 10 Mo (10000 Ko) par fichier (donc, en particulier, chaque fichier doit être décompressé seul). Si je tar.gz
tous ces fichiers, le fichier résultant est d'environ 72 Mo.
Ce que je voudrais faire, c'est créer huit .tar.gz
fichiers, chacun de taille / dimension (strictement) inférieure à 10000 Ko.
Alternativement, on peut supposer que tous les fichiers ci-dessus ont approximativement la même dimension, donc je voudrais créer huit .tar.gz
fichiers avec plus ou moins la même quantité de fichiers chacun.
Comment puis-je effectuer l'une de ces deux tâches?
Je suis parfaitement d'accord avec une solution qui implique une interface graphique, une CLI ou un script. Je ne cherche pas de vitesse ici, j'ai juste besoin de le faire.
la source
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.Réponses:
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:
Comment utiliser
compress_split.py
Exécutez-le avec le répertoire avec vos fichiers comme argument:
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:
É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:
Courir:
... 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 !
la source
tar
davantage l' invocation en fournissant la liste des fichiers sur le flux d'entrée standard.tar
vous permet de spécifier des fichiers à ajouter (ou extraire) sur une entrée standard avec une option appropriée.Une approche pure shell:
Explication
files=(*)
: enregistrez la liste des fichiers (également les répertoires s'il y en a, changezfiles=(*.txt)
pour obtenir uniquement les choses avec unetxt
extension) dans le tableau$files
.num=$((${#files[@]}/8));
:${#files[@]}
est le nombre d'éléments dans le tableau$files
. C'est$(( ))
la façon (limitée) de bash de faire de l'arithmétique. Ainsi, cette commande définit$num
le nombre de fichiers divisé par 8.k=1
: juste un compteur pour nommer les tarballs.for ((i=0; i<${#files[@]}; i+=$num)); do
: itère sur les valeurs du tableau.$i
est initialisé à0
(le premier élément du tableau) et incrémenté de$num
. Cela continue jusqu'à ce que nous ayons parcouru tous les éléments (fichiers).tar cvzf files$i.tgz -- ${files[@]:$i:$num}
: en bash, vous pouvez obtenir une tranche de tableau (partie d'un tableau) en utilisant${array[@]:start:length}
, So${array[@]:2:3}
renverra trois éléments à partir du second. Ici, nous prenons une tranche qui commence à la valeur actuelle de$i
et est$num
longue. Le--
est nécessaire dans le cas où l'un de vos noms de fichiers peut commencer par un-
.((k++))
: incrément$k
la source