Bagaimana cara menggabungkan / menggabungkan file zip?

21

Selama beberapa bulan terakhir saya telah menyalin beberapa folder data ke file zip pada interval mingguan. Sekarang saya ingin menggabungkan file zip tersebut menjadi satu file zip, karena sebagian besar isi file zip yang ada hanyalah versi berbeda dari file data yang sama.

Jadi jika sebuah file muncul di lebih dari satu file zip yang ada, saya ingin versi terbaru ada di file zip baru yang sedang dibuat. Tentu saja jika suatu file hanya muncul di satu file zip yang ada, maka saya juga menginginkannya di file zip final.

Saya mencoba menghindari keharusan unzip satu per satu ke folder yang berfungsi, menimpa data dari file zip yang lebih lama dengan data dari file zip yang lebih baru, dan kemudian rezipping semuanya menjadi file zip baru.

Dari apa yang saya mengerti, pkzip akan menggabungkan file zip sendiri, tetapi apakah ada metode gratis yang dapat diandalkan dan cepat yang dapat diceritakan orang kepada saya?

CChriss
sumber
1
zipmerge untuk menang
Code Bling

Jawaban:

7

Anda tidak akan menyukainya tetapi: membuka ritsleting segala sesuatu ke dalam folder yang berfungsi dengan urutan yang benar, kemudian zip hasilnya adalah cara yang paling efektif.

jika tidak, Anda akan berakhir dengan banyak siklus CPU yang terbuang:

  • anggap hasil Anda masuk ke 'first.zip'
  • setiap file dari '2.zip', '3.zip' dll harus di-unzip dan kemudian di-zip lagi menjadi 'first.zip'
  • di '2.zip' ada file 'foobar.txt' dan di '3.zip' ada file lain 'foobar.txt'. menggabungkannya dengan cara yang Anda inginkan untuk menggabungkannya mengarah ke 'kompres X kali'
  • toc dari .zip ada di akhir file: Anda menambahkan lebih banyak konten (ke tengah
    .zip dengan memperbarui file di tengah) dan seluruh file harus ditulis ulang

jadi, saya hanya menggunakan ' unzip ' wiseley:

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

urutan unzip itu penting, saya tidak tahu pola nama zip Anda, tapi saya akan mengekstrak file zip terbaru terlebih dahulu, opsi '-u' unzip hanya menimpa file jika lebih baru atau membuat file jika tidak sudah disana. sebagai hasilnya, Anda hanya akan meng-unzip file-file terbaru dan meng-zip hasilnya hanya sekali.

akira
sumber
Ini mungkin paling efektif dari perspektif pengguna - tetapi tidak akurat. Tabel file dalam zip sebenarnya ada di akhir, tetapi Anda dapat secara sewenang-wenang menulis file ke akhir zip apa pun dan kemudian menulis tabel file baru. Catatan terakhir selalu menang. Mereka yang sedikit terbiasa dengan scripting atau pemrograman dapat melakukan seluruh proses ini tanpa membuka atau mengompresi file sama sekali hanya dengan memindahkan potongan biner di sekitar dan memperbarui tabel zip.
caesay
Bahkan, Anda bisa menyatukan semua zip menjadi satu file (sesuai urutan yang Anda inginkan) dan kemudian menulis catatan file baru pada akhirnya hanya menyertakan versi terbaru file. Ini memiliki manfaat tambahan bahwa zip masih berisi semua versi file yang sebelumnya yang dapat dipulihkan jika perlu
caesay
"setiap file dari '2.zip', '3.zip' dll harus di-unzip dan kemudian di-zip kembali ke 'first.zip'" tidak benar. The zipmergegabungan utilitas ZIP arsip tanpa dekompresi dan re-mengompresi, misalnya.
ZachB
Saya menggunakan unzipping/ zippingdan tidak uncompress / decompress. Ya, jelas seseorang dapat mengambil satu entri 2.zip(gumpalan terkompresi) dan mentransfernya ke dalam first.zipdan dengan demikian tidak ada "kompresi" harus dilakukan. Tetapi Anda harus mengekstrak gumpalan dari 2.zip, mencari keberadaan di TOC first.zip, jika itu ada baik menggantikan entri yang ada (yang berarti Anda harus menulis ulang seluruh file pada dasarnya) atau menambahkannya di akhir - dan setelah itu Anda perlu tambahkan toc dari zip. Saya tidak melihat bagaimana zipmergebisa mencapai penggabungan entri-zip dengan cara yang berbeda (mengesampingkan kompresi)
akira
-1 karena ada jauh lebih efisien cara untuk melakukan tugas ini, dan tidak ada pembenaran untuk ini menjadi "cara paling efektif" masuk akal sedikit pun. every file [...] has to be unzipped and then zipped again- tidak ada, itulah yang Anda solusi tidak. 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'- tidak, tidak. Kenapa harus begitu? you add more content [...] and the whole file has to be rewritten- tidak, Anda menulis output dalam satu pass. Mengapa ada orang yang meneguhkan ini?
benrg
4

Cukup gunakan opsi -g ZIP, di mana Anda dapat menambahkan sejumlah file ZIP menjadi satu (tanpa mengekstrak yang lama). Ini akan menghemat waktu Anda secara signifikan.

Lihat juga zipmerge

Christos
sumber
4
-gmenambahkan file ke zip yang ada. itu tidak menggabungkan mereka. misalnya: zip -g result.zip other.zipakan menambahkan file other.zipke result.zip . --grow Grow (tambahkan ke) arsip zip yang ditentukan, alih-alih membuat yang baru. Jika operasi ini gagal, zip mencoba mengembalikan arsip ke keadaan semula. Jika pemulihan gagal, arsip mungkin rusak. Opsi ini diabaikan ketika tidak ada arsip yang ada atau ketika setidaknya satu anggota arsip harus diperbarui atau dihapus.`
akira
2

https://linux.die.net/man/1/zipmerge :

zipmerge menggabungkan arsip zip sumber source-zipke arsip zip target target-zip. Secara default, file dalam arsip zip sumber menimpa file yang ada dengan nama yang sama di arsip zip target.

imz - Ivan Zakharyaschev
sumber
1

Saya pikir Anda bisa skrip file yang diekstraksi ke direktori temp.

Ada masalah dengan baris perintah ini. Saya tidak dapat menemukan cara untuk memesan unzipping arsip, sehingga arsip yang lebih lama dapat menimpa arsip yang lebih baru. Masalah ini dapat diatasi dengan menggunakan unzipper yang memiliki saklar baris perintah untuk hanya menimpa jika lebih baru. Saya terutama menggunakan 7-Zip yang tidak memiliki opsi baris perintah seperti itu.

Juga, perintah ini perlu pada semua file zip yang ada di direktori yang sama. Tidak masalah jika semua ritsleting memiliki nama unik. Yang mengatakan, perintah dapat diubah agar sesuai dengan situasi Anda.

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

Untuk mengubah ini menggunakan program unzipping lain cukup ganti "c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoadengan perintah apa pun yang Anda akan lakukan pada setiap file. Gunakan %fsebagai tempat penampung untuk nama file yang ingin Anda unzip.

Saya mencoba mencari aplikasi yang dipoles, gratis atau tidak dan tidak benar-benar menemukannya.

Semoga ini akan memberi Anda awal yang baik dan WinZip atau yang serupa dapat mengatasi masalah yang ditimpa.

Semoga berhasil.

Scott McClenning
sumber
0

Jika saya ingat dengan benar, pkzip adalah program command-line.

Masih ada versi baris perintah ZIP yang mengklaim kompatibel dengan pkzip.

Ini disebut Info-ZIP dan harus ada versi untuk OS Anda.

pavium
sumber
Apakah ada fungsi yang saya tanyakan? Saya tidak dapat menemukan di mana daftar kemampuan ini.
CChriss
1
Suite Info-Zip membuat file kompatibel dengan PKZip, tetapi programnya sendiri berbeda dan sepertinya tidak menyertakan opsi penggabungan.
CarlF
OK, maaf, saya bisa mengkompilasi dan menjalankan Info-Zip pada workstation Apollo di bawah DOMAIN / OS bertahun-tahun yang lalu. Saya ingat itu menyediakan fitur yang berbeda pada DOS / VMS / Unix dan beberapa lainnya, bahkan kemudian. Saya kira itu mungkin telah berkembang lebih lanjut.
pavium
0

Cari baris perintah winzip di internet. Winzip memiliki beberapa versi alat baris perintah agar sesuai dengan versi winzip apa pun yang mungkin Anda pasang. Alat baris perintah WZZIP memiliki opsi -f "freshen" yang akan mem-zip file yang lebih baru hanya dari mereka yang cocok dengan nama file dalam file zip output penjumlahan.

Gunakan WZunzip yang dibungkus dalam pernyataan FOR seperti yang ditunjukkan di atas untuk unzip satu file ke direktori kemudian WZzip -f untuk menambahkan file-file itu ke file zip penjumlahan output. Kemudian loop FOR mengulangi untuk bekerja pada file input berikutnya untuk output ke file output penjumlahan satu-satunya. Urutan file input tidak menjadi masalah karena WZzip -f hanya akan menambah file output jika data input lebih baru dari apa yang sudah ada dalam file output. Semua file yang tidak ada di file output juga akan ditambahkan. Kemudian Anda dapat mengekstrak hasil ke folder dan kemudian zip lagi untuk mendapatkan file hasil yang dikemas secara efisien. Anda bahkan dapat melakukan ini secara otomatis setelah loop FOR di akhir file batch.

eewiz
sumber