Come combinare / unire i file zip?


21

Negli ultimi mesi ho copiato diverse cartelle di dati in file zip a intervalli settimanali. Ora vorrei combinare quei file zip in un unico file zip, poiché la maggior parte dei contenuti dei file zip esistenti sono solo versioni diverse degli stessi file di dati.

Quindi, se un file appare in più di uno dei file zip esistenti, mi piacerebbe che la versione più recente fosse nel nuovo file zip creato. Naturalmente se un file appare in un solo file zip esistente, lo voglio anche nel file zip finale.

Sto cercando di evitare di doverli decomprimere uno per uno in una cartella di lavoro, sovrascrivendo i dati dai file zip più vecchi con i dati dai file zip più recenti e quindi riordinando tutto in un nuovo file zip.

Da quello che ho capito pkzip avrebbe combinato i file zip stessi, ma esiste un metodo gratuito affidabile e veloce che qualcuno può dirmi?


1
zipmerge per la vittoria
Code Bling

Risposte:


7

non ti piacerà ma: decomprimere tutto in una cartella di lavoro nel giusto ordine, quindi comprimere il risultato è il modo più efficace.

altrimenti, finirai con molti cicli CPU sprecati:

  • supponiamo che il risultato vada a "first.zip"
  • ogni file da '2.zip', '3.zip' ecc deve essere decompresso e quindi zippato di nuovo in 'first.zip'
  • in '2.zip' esiste un file 'foobar.txt' e in '3.zip' esiste un altro file 'foobar.txt'. la fusione nel modo in cui si desidera unire porta a "comprimerlo X volte"
  • il toc di un .zip è alla fine del file: aggiungi più contenuto (al centro del
    .zip aggiornando un file nel mezzo) e l'intero file deve essere riscritto

quindi, imho basta usare wiseley ' decomprimere ':

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

l'ordine della decompressione è importante, non conosco lo schema dei tuoi nomi zip, ma estrarrei prima il file zip più recente, l'opzione '-u' di decomprimere sovrascrive solo i file se sono più recenti o crea file se non già là. di conseguenza, decomprimerai solo i file più recenti e comprimerai il risultato solo una volta.


Questo potrebbe essere più efficace dal punto di vista dell'utente, ma non è preciso. La tabella dei file in uno zip è in effetti alla fine, ma è possibile scrivere arbitrariamente file alla fine di qualsiasi zip e quindi scrivere una nuova tabella di file. L'ultimo record vince sempre. Coloro che hanno un po 'di familiarità con gli script o la programmazione potrebbero eseguire l'intero processo senza decomprimere o comprimere alcun file semplicemente spostando i blocchi binari e aggiornando la tabella zip.
martedì

In effetti, potresti semplicemente concatenare tutti gli zip in un singolo file (nell'ordine desiderato) e quindi scrivere un nuovo record di file alla fine per includere solo le ultime versioni dei file. Questo ha l'ulteriore vantaggio che zip contiene ancora tutte le versioni precedenti di file che possono essere recuperate se nessesary
ca

"ogni file da '2.zip', '3.zip' ecc deve essere decompresso e quindi zippato di nuovo in 'first.zip'" non è corretto. L' zipmergeutilità unisce gli archivi ZIP senza decomprimere e ricomprimere, per esempio.
ZachB,

Ho usato unzipping/ zippinge no uncompress / decompress. Sì, ovviamente si può prendere una voce di 2.zip(il BLOB compresso) e trasferirlo in, first.zipquindi non deve avvenire alcuna "compressione". Ma devi estrarre il BLOB da 2.zip, cercare l'esistenza nel sommario di first.zip, se è lì o sostituire la voce esistente (il che significa che devi sostanzialmente riscrivere l'intero file) o aggiungerlo alla fine - e dopo che è necessario aggiungi il toc della zip. Non vedo come si zipmergepossa ottenere l'unione delle voci zip in modo diverso (compressione a parte)
Akira,

-1 perché ci sono modi molto più efficienti per svolgere questo compito, e nessuna delle giustificazioni per questo essere "il modo più efficace" ha il minimo senso. every file [...] has to be unzipped and then zipped again- no, ecco cosa fa la tua soluzione. 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'- no non lo fa. Perché dovrebbe? you add more content [...] and the whole file has to be rewritten- no, scrivi l'output in un passaggio. Perché qualcuno ha votato a questo?
benrg

4

Basta usare l'opzione -g di ZIP, dove è possibile aggiungere un numero qualsiasi di file ZIP in uno (senza estrarre quelli vecchi). Questo ti farà risparmiare tempo significativo.

Dai un'occhiata anche a zipmerge


4
-gaggiunge file a una zip esistente. non li unisce. es: zip -g result.zip other.zipaggiungerà il file other.zipin result.zip . --grow Coltiva (aggiungi a) l'archivio zip specificato, invece di crearne uno nuovo. Se questa operazione non riesce, zip tenta di ripristinare l'archivio al suo stato originale. Se il ripristino non riesce, l'archivio potrebbe essere danneggiato. Questa opzione viene ignorata quando non c'è archivio esistente o quando almeno un membro archivio deve essere aggiornato o deleted.`
Akira



1

Stavo pensando che potresti scrivere i file estratti in una directory temporanea.

Si è verificato un problema con questa riga di comando. Non sono riuscito a trovare un modo per ordinare la decompressione degli archivi, quindi un archivio più vecchio potrebbe sovrascrivere un archivio più recente. Questo problema può essere risolto utilizzando un decompressore che ha un'opzione della riga di comando per sovrascrivere solo se più recente. Uso principalmente 7-Zip che non ha tale opzione da riga di comando.

Inoltre, questo comando richiede che tutti i file zip si trovino nella stessa directory. Non è un problema se tutte le zip hanno nomi univoci. Detto questo, il comando può essere modificato in base alla propria situazione.

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

Per cambiarlo e usare un altro programma di decompressione, sostituiscilo "c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoacon qualunque comando eseguiresti su ogni file. Utilizzare %fcome segnaposto per il nome del file che si desidera decomprimere.

Ho provato a cercare un'app raffinata, gratuita o meno e non l'ho trovata davvero.

Spero che questo ti dia un buon inizio e WinZip o qualcosa di simile possa occuparsi del problema di sovrascrittura.

In bocca al lupo.


0

Se ricordo bene, pkzip era un programma da riga di comando.

C'è ancora una versione a riga di comando di ZIP che afferma di essere compatibile con pkzip.

Si chiama Info-ZIP e dovrebbe esserci una versione per il tuo sistema operativo.


Ha la funzionalità di cui sto chiedendo? Non riesco a trovare dove elenca questa capacità.
CChriss,

1
La suite Info-Zip rende i file compatibili con PKZip, ma i programmi stessi sono diversi e non sembrano includere un'opzione di unione.
CarlF,

OK, scusa, sono stato in grado di compilare ed eseguire Info-Zip su una workstation Apollo sotto DOMAIN / OS molti anni fa. Ricordo che forniva diverse funzionalità su DOS / VMS / Unix e alcune altre, anche allora. Suppongo che potrebbe essersi evoluto ulteriormente.
padiglione

0

Cerca la riga di comando di winzip in rete. Winzip ha diverse versioni degli strumenti da riga di comando per adattarsi a qualsiasi versione di WinZip possiate aver installato. Lo strumento da riga di comando WZZIP ha un'opzione -f "freshen" che comprime solo i file più recenti di quelli che corrispondono al nome di un file nel file zip di output della somma.

Usa WZunzip racchiuso in un'istruzione FOR come mostrato sopra per decomprimere un file in una directory, quindi WZzip -f per aggiungere quei file a un file zip della somma di output. Quindi il ciclo FOR si ripete per funzionare sul file di input successivo per l'output nell'unico e unico file di output della somma. L'ordine dei file di input non ha importanza poiché WZzip -f verrà aggiunto al file di output solo se i dati di input sono più recenti di quelli già presenti nel file di output. Verranno aggiunti anche tutti i file che non esistono nel file di output. Quindi è possibile decomprimere il risultato in una cartella e quindi comprimerlo nuovamente per ottenere un file di risultati impacchettato in modo efficiente. Puoi anche farlo automaticamente dopo il ciclo FOR alla fine del file batch.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.