Comment combiner / fusionner des fichiers zip?


21

Au cours des derniers mois, j'ai copié plusieurs dossiers de données pour compresser des fichiers à intervalles hebdomadaires. Maintenant, je voudrais combiner ces fichiers zip en un seul fichier zip, car la plupart du contenu des fichiers zip existants ne sont que des versions différentes des mêmes fichiers de données.

Donc, si un fichier apparaît dans plusieurs des fichiers zip existants, j'aimerais que la version la plus récente soit dans le nouveau fichier zip en cours de création. Bien sûr, si un fichier apparaît dans un seul fichier zip existant, je le veux également dans le fichier zip final.

J'essaie d'éviter d'avoir à les décompresser un par un dans un dossier de travail, en écrasant les données des fichiers zip plus anciens avec des données des fichiers zip plus récents, puis en recompressant le tout dans un nouveau fichier zip.

D'après ce que je comprends, pkzip combinerait les fichiers zip eux-mêmes, mais y a-t-il une méthode gratuite fiable et rapide dont tout le monde peut me parler?


1
zipmerge pour la victoire
Code Bling

Réponses:


7

vous ne l'aimerez pas mais: décompressez tout dans un dossier de travail dans le bon ordre, puis compresser le résultat est le moyen le plus efficace.

sinon, vous vous retrouverez avec beaucoup de cycles CPU gaspillés:

  • supposez que votre résultat va à 'first.zip'
  • chaque fichier de «2.zip», «3.zip», etc. doit être décompressé, puis à nouveau compressé dans «first.zip»
  • dans '2.zip' existe un fichier 'foobar.txt' et dans '3.zip' existe un autre fichier 'foobar.txt'. le fusionner comme vous le souhaitez pour le fusionner conduit à «le compresser X fois»
  • le toc d'un .zip est à la fin du fichier: vous ajoutez plus de contenu (au milieu du
    .zip en mettant à jour un fichier au milieu) et le fichier entier doit être réécrit

donc, à mon humble avis, utilisez simplement « décompressez » wiseley:

% mkdir all
% for x in *.zip ; do unzip -d all -o -u $x ; done
% zip -r all.zip all

l'ordre de décompression est important, je ne connais pas le modèle de vos noms de zip, mais je voudrais d'abord extraire le fichier zip le plus récent, l'option '-u' de décompresser écrase uniquement les fichiers s'ils sont plus récents ou crée des fichiers dans le cas contraire déjà là. en conséquence, vous décompresserez uniquement les fichiers les plus récents et compresserez le résultat une seule fois.


Cela pourrait être plus efficace du point de vue de l'utilisateur - mais ce n'est pas exact. La table de fichiers dans un zip est en fait à la fin, mais vous pouvez écrire arbitrairement des fichiers à la fin de n'importe quel zip, puis écrire une nouvelle table de fichiers. Le dernier record l'emporte toujours. Ceux qui connaissent un peu les scripts ou la programmation peuvent faire tout ce processus sans décompresser ni compresser aucun fichier en déplaçant simplement les morceaux binaires et en mettant à jour la table zip.
caesay

En fait, vous pouvez simplement concaténer tous les fichiers zip dans un seul fichier (dans l'ordre que vous souhaitez), puis écrire un nouvel enregistrement de fichier à la fin pour n'inclure que les dernières versions des fichiers. Cela a l'avantage supplémentaire que le zip contient toujours toutes les versions précédentes des fichiers qui peuvent être récupérés si nécessaire
caesay

"tous les fichiers de '2.zip', '3.zip', etc. doivent être décompressés puis zippés à nouveau dans 'first.zip'" n'est pas correct. L' zipmergeutilitaire fusionne les archives ZIP sans décompresser ni recompresser, par exemple.
ZachB

J'ai utilisé unzipping/ zippinget non uncompress / decompress. Oui, évidemment, on peut prendre une entrée de 2.zip(le blob compressé) et la transférer first.zipet donc aucune "compression" ne doit avoir lieu. Mais vous devez extraire le blob 2.zip, rechercher l'existant dans la table des matières de first.zip, s'il y a soit remplacer l'entrée existante (ce qui signifie que vous devez réécrire le fichier entier en gros) ou l'ajouter à la fin - et après cela, vous devez ajoutez le toc du zip. Je ne vois pas comment zipmergeréaliser la fusion d'entrées zip d'une manière différente (compression de côté)
akira

-1 parce qu'il existe des moyens beaucoup plus efficaces de faire cette tâche, et aucune des justifications pour que ce soit "le moyen le plus efficace" n'a le moindre sens. every file [...] has to be unzipped and then zipped again- non, c'est ce que fait votre solution. in '2.zip' exists a file 'foobar.txt' and in '3.zip' exists another file 'foobar.txt'. merging it the way you want to merge it leads to 'compress it X times'- non. Pourquoi ça? you add more content [...] and the whole file has to be rewritten- non, vous écrivez la sortie en un seul passage. Pourquoi quelqu'un a-t-il voté contre cela?
benrg

4

Utilisez simplement l'option -g de ZIP, où vous pouvez ajouter n'importe quel nombre de fichiers ZIP en un seul (sans extraire les anciens). Cela vous fera gagner un temps considérable.

Découvrez également zipmerge


4
-gajoute des fichiers à un zip existant. il ne les fusionne pas. par exemple: zip -g result.zip other.zipva ajouter le fichier other.zipdans result.zip --grow . Agrandir (ajouter à) l'archive zip spécifiée, au lieu d'en créer une nouvelle. Si cette opération échoue, zip tente de restaurer l'archive à son état d'origine. Si la restauration échoue, l'archive peut être corrompue. Cette option est ignorée lorsqu'il n'y a pas d'archive existante ou quand au moins un membre d'archive doit être mis à jour ou supprimé. »
akira



1

Je pensais que vous pourriez écrire les fichiers extraits dans un répertoire temporaire.

Il y a un problème avec cette ligne de commande. Je n'ai pas trouvé de moyen de commander la décompression des archives, donc une archive plus ancienne peut écraser une archive plus récente. Ce problème peut être résolu en utilisant une décompression qui possède un commutateur de ligne de commande pour écraser uniquement s'il est plus récent. J'utilise principalement 7-Zip qui n'a pas une telle option de ligne de commande.

De plus, cette commande a besoin que tous les fichiers zip se trouvent dans le même répertoire. Pas de problème si toutes les zips ont des noms uniques. Cela dit, la commande peut être modifiée pour s'adapter à votre situation.

for /f %f in ('dir /b *.zip') do "c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoa

Pour changer cela pour utiliser un autre programme de décompression, il suffit de remplacer "c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoapar la commande que vous exécutez sur chaque fichier. Utilisez %fcomme espace réservé pour le nom du fichier que vous souhaitez décompresser.

J'ai essayé de chercher une application soignée, gratuite ou non, mais je n'en ai pas vraiment trouvé.

Espérons que cela vous donnera un bon départ et que WinZip ou quelque chose de similaire puisse résoudre le problème d'écrasement.

Bonne chance.


0

Si je me souviens bien, pkzip était un programme en ligne de commande.

Il existe toujours une version en ligne de commande de ZIP qui prétend être compatible avec pkzip.

Cela s'appelle Info-ZIP et il devrait y avoir une version pour votre système d'exploitation.


At-il la fonctionnalité que je demande? Je ne trouve pas où il répertorie cette capacité.
CChriss

1
La suite Info-Zip rend les fichiers compatibles avec PKZip, mais les programmes eux-mêmes sont différents et ne semblent pas inclure d'option de fusion.
CarlF

OK, désolé, j'ai pu compiler et exécuter Info-Zip sur un poste de travail Apollo sous DOMAIN / OS il y a de nombreuses années. Je me souviens qu'il fournissait différentes fonctionnalités sur DOS / VMS / Unix et quelques autres, même alors. Je suppose que cela a peut-être évolué davantage.
pavium du

0

Recherchez la ligne de commande winzip sur le net. Winzip dispose de plusieurs versions d'outils de ligne de commande pour s'adapter à n'importe quelle version de winzip que vous pourriez avoir installée. L'outil de ligne de commande WZZIP a une option -f "actualiser" qui compressera les fichiers les plus récents uniquement ceux qui correspondent au nom d'un fichier dans le fichier zip de sortie de la sommation.

Utilisez WZunzip enveloppé dans une instruction FOR comme indiqué ci-dessus pour décompresser un fichier dans un répertoire, puis WZzip -f pour ajouter ces fichiers à un fichier zip de sommation de sortie. Ensuite, la boucle FOR se répète pour travailler sur le fichier d'entrée suivant pour sortir vers le seul et unique fichier de sortie de sommation. L'ordre des fichiers d'entrée n'a pas d'importance car WZzip -f ne s'ajoutera au fichier de sortie que si les données d'entrée sont plus récentes que celles déjà présentes dans le fichier de sortie. Tous les fichiers qui n'existent pas dans le fichier de sortie seront également ajoutés. Ensuite, vous pouvez décompresser le résultat dans un dossier, puis le compresser à nouveau pour obtenir un fichier de résultat efficacement compressé. Vous pouvez même le faire automatiquement après la boucle FOR à la fin du fichier de commandes.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.