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?
Réponses:
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:
.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:
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.
la source
zipmerge
utilitaire fusionne les archives ZIP sans décompresser ni recompresser, par exemple.unzipping
/zipping
et nonuncompress / decompress
. Oui, évidemment, on peut prendre une entrée de2.zip
(le blob compressé) et la transférerfirst.zip
et donc aucune "compression" ne doit avoir lieu. Mais vous devez extraire le blob2.zip
, rechercher l'existant dans la table des matières defirst.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 commentzipmerge
réaliser la fusion d'entrées zip d'une manière différente (compression de côté)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?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
la source
-g
ajoute des fichiers à un zip existant. il ne les fusionne pas. par exemple:zip -g result.zip other.zip
va ajouter le fichierother.zip
dans 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é. »Ce n'est peut-être pas ce que vous recherchez, mais l'outil de génération gratuit Ant inclut la possibilité de fusionner des fichiers Zip.
https://ant.apache.org/manual/Tasks/zip.html
la source
https://linux.die.net/man/1/zipmerge :
la source
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 -aoa
par la commande que vous exécutez sur chaque fichier. Utilisez%f
comme 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.
la source
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.
la source
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.
la source