Zip de nombreux fichiers dans plusieurs archives

13

Sous Linux. J'ai un répertoire d'environ 150 gros fichiers CSV; il suffit de faire un zip -9sur eux pour créer un fichier monolithique encore trop volumineux. Je voudrais simplement les compresser en peut-être quatre ou cinq fichiers zip de 30 à 40 CSV chacun; De cette façon, le séquençage ou la commande de zip fractionnée ne sera pas un problème, car chaque zip est indépendant. Il doit y avoir un moyen simple de le faire. Aucune suggestion?

(et oui, zip est le format préféré, si possible)

WorldsEndless
la source

Réponses:

23

Le commutateur -s n'est-il pas suffisant? Vous pouvez utiliser des zip -s pour diviser le fichier en fichiers de taille maximale, par exemple:

"zip -s 300m <fichier 2 gb>" produit:

file.zip (300 mb, master file)
file.001.zip (300 mb)
file.002.zip (300 mb)
file.003.zip (300 mb)
file.004.zip (300 mb)
file.005.zip (300 mb)
file.006.zip (200 mb)

Ensuite, "décompressez le fichier.zip" décompressera tout ensemble.

ranisalt
la source
Quelle version de zip est-ce ?? J'obtiens file.z01 file.z02 ... file.zip et unzip file.zipne fonctionne pas directement (j'utiliserais zip -F pour les recombiner en premier). Notez que ceux-ci ne sont pas "indépendants" comme demandé.
sourcejedi
1
@sourcejedi: Dans cette réponse ( superuser.com/a/602736/195224 ) sont des explications plus détaillées.
mpy
@mpy Je sais, je viens d'écrire cette réponse :).
sourcejedi
@sourcejedi: Oh oui, maintenant vous le dites ...;)
mpy
2

Utiliser split sur la liste des fichiers d'entrée :-).

(Non testé, j'ai inclus des commandes rm pour le nettoyage, faites attention).

ls *.csv > csvfiles
split -d -l30 - csvfiles < csvfiles
for i in csvfiles[0-9][0-9]; do
  zip "$i.zip" -@ < "$i"
done

rm csvfiles
rm csvfiles[0-9][0-9]
sourcejedi
la source
Pourquoi utilisez-vous split -C( --line-bytes) et non split -l( --lines)? Ce serait plus prévisible, en ce qui concerne le nombre de fichiers CSV dans une archive.
mpy
J'ai survolé la page de manuel trop rapidement. Merci, je vais le réparer!
sourcejedi