Cara memperbarui satu file dalam arsip zip

88

Apakah mungkin untuk mengganti file dalam file zip tanpa membuka ritsleting, menghapus file lama, menambahkan file baru dan mengembalikannya?

Alasannya adalah saya memiliki file zip yang sangat besar, ada satu xml di dalam file zip yang terkadang harus saya perbarui. Membuka zip dan membukanya kembali membutuhkan waktu lama. Jadi saya hanya ingin mengganti satu xml di dalam zip melalui skrip. Saya sudah memeriksa pembaruan pada xml yang saya miliki.

Jadi apakah mungkin hanya mengganti satu xml tanpa membuka ritsleting dan membuat ritsleting ulang?

Maaf saya akan menggunakan perintah zip untuk melakukan hal-hal seperti itu tetapi masalahnya adalah skrip sebenarnya untuk ponsel android dan zip bukan perintah yang dapat saya gunakan sayangnya maaf saya meninggalkannya. Saya akan menggunakan zip dengan pasti jika saya bisa tetapi saya hanya memiliki unzip untuk droid dan kemudian ada tar di busybox tetapi tar tidak melakukan apa yang saya butuhkan

pengguna577732
sumber
3
dapatkah Anda mengubah judul pertanyaan menjadi sesuatu yang lebih bermakna?
tokland
7
Juga, pertanyaannya bisa jadi satu atau dua kalimat. Sekitar 80% darinya bertele-tele.
Dennis Williamson

Jawaban:

63

Dari zip (1) :

Ketika diberi nama arsip zip yang ada, zip akan menggantikan entri dengan nama yang sama dalam arsip zip atau menambahkan entri untuk nama baru.

Jadi gunakan saja zipperintah seperti biasa untuk membuat file .zip baru yang hanya berisi satu file itu, kecuali nama file .zip yang Anda tentukan akan menjadi arsip yang ada.

Mohon Berdiri
sumber
5
Bisakah seseorang memberi contoh? Saya tidak mengerti bantuan dari perintah zip.
Gustave
12
Katakanlah Anda membuat zip myfolder menggunakan zip -r myfolder.zip myfolderjika Anda ingin memperbarui myfolder/otherfolder/myfile.txt, lanjutkan dan edit file dan jalankanzip -r myfolder.zip myfolder/otherfolder/myfile.txt
eakkas
1
Bagaimana cara melakukannya jika file yang akan diganti tidak memiliki nama yang sama atau struktur yang sama dengan file yang akan diganti?
Fractaliste
2
@Fractaliste Anda harus membuatnya memiliki nama dan struktur yang sama;)
Hack5
74

Saya telah menemukan zipfile Linux menjadi rumit untuk mengganti satu file dalam zip. The jarutilitas dari Java Development Kit mungkin lebih mudah. Pertimbangkan tugas umum untuk memperbarui WEB/web.xmlfile JAR (yang hanya berupa file zip):

jar -uf path/to/myapp.jar -C path/to/dir WEB-INF/web.xml

Di sini, path/to/diradalah jalur ke direktori yang berisi WEB-INFdirektori (yang pada gilirannya berisi web.xml).

cayhorstmann
sumber
bagaimana jika saya harus menyalin hanya file daripada membuat direktur WEB-INFyang memiliki file itu.
Bantuan pada
Juga dalam kasus saya, util "toples" tua yang baik itu berhasil! Terima kasih!
bitfox
52

Coba yang berikut ini:

zip [zipfile] [file to update] 

Sebuah contoh:

$ zip test.zip test/test.txt
updating: test/test.txt (stored 0%)
WizardsOfWor
sumber
2
Ini adalah yang termudah untuk dipahami berkat contohnya, terima kasih!
vatsug
2
Memperhitungkan bahwa Anda harus melihat updating:bukan adding:jika Anda ingin memperbarui file dalam zip; jika tidak, Anda menambahkan file ke zip, bukan menggantinya.
Edenshaw
Anda benar, saya tidak menyadarinya. Diperbarui, terima kasih!
WizardsOfWor
13

Saya tahu ini pertanyaan lama, tetapi saya ingin melakukan hal yang sama. Perbarui file dalam arsip zip. Dan tidak ada jawaban di atas yang benar-benar membantu saya.

Inilah yang saya lakukan. Direktori temp dibuat abc. Disalin file.zipke abcdan diekstrak file dalam direktori tersebut. Saya mengedit file yang ingin saya edit. Kemudian saat sedang masuk abc, jalankan perintah berikut

user@host ~/temp/abc $ zip -u file.zip
updating: content/js/ (stored 0%)
updating: content/js/moduleConfig.js (deflated 69%)

-u switch akan mencari file yang diubah / baru dan akan menambah arsip zip.

tradisional
sumber
12

Gunakan bendera pembaruan: -u

Contoh:

zip -ur existing.zip myFolder

Perintah ini akan memampatkan dan menambahkan myFolder(dan isinya) ke file existing.zip.


Penggunaan Lanjutan:

Bendera pembaruan sebenarnya membandingkan file yang masuk dengan yang sudah ada dan akan menambahkan file baru, atau memperbarui yang sudah ada.

Oleh karena itu, jika Anda ingin menambah / memperbarui subdirektori tertentu dalam file zip, cukup perbarui sumber sesuai keinginan, lalu zip ulang seluruh sumber dengan -ubendera. Hanya file yang diubah yang akan dizip.

Jika Anda tidak memiliki akses ke file sumber, Anda dapat mengekstrak file zip tersebut, lalu memperbarui file yang diinginkan, dan kemudian melakukan zip ulang dengan -ubendera tersebut. Sekali lagi, hanya file yang diubah yang akan di-zip.

Contoh:

Struktur Sumber Asli


ParentDir
├── file1.txt
├── file2.txt
├── ChildDir
│   ├── file3.txt
│   ├── Logs
│   │   ├── logs1.txt
│   │   ├── logs2.txt
│   │   ├── logs3.txt

Struktur Sumber Diperbarui


ParentDir
├── file1.txt
├── file2.txt
├── ChildDir
│   ├── file3.txt
│   ├── Logs
│   │   ├── logs1.txt
│   │   ├── logs2.txt
│   │   ├── logs3.txt 
│   │   ├── logs4.txt <-- NEW FILE 

Pemakaian

$ zip -ur existing.zip ParentDir 
> updating: ParentDir/ChildDir/Logs (stored 0%)
>   adding: ParentDir/ChildDir/Logs/logs4.txt (stored 96%)
Ethan Strider
sumber
5

Anda dapat menggunakan: zip -u file.zip path / file_to_update

Renato Luiz Ramos
sumber
1

Ada juga opsi -f yang akan menyegarkan file zip. Ini dapat digunakan untuk memperbarui SEMUA file yang telah diperbarui sejak zip dibuat (dengan asumsi mereka berada di tempat yang sama dalam struktur pohon dalam file zip).

Jika file Anda bernama /myfiles/myzip.zip, yang harus Anda lakukan adalah

zip -f /myfiles/myzip.zip
W7GVR
sumber
0

Dari sisi struktur arsip ZIP - Anda dapat memperbarui file zip tanpa mengompresnya kembali, Anda hanya perlu melewati semua file yang sebelumnya dari file yang perlu Anda ganti, lalu meletakkan file yang telah diperbarui, dan kemudian file lainnya. Dan akhirnya Anda harus meletakkan struktur direktori pusat yang diperbarui. Namun, saya ragu bahwa alat yang paling umum akan memungkinkan Anda membuat ini.

Nickolay Olshevsky
sumber
0

7zip (7za) dapat digunakan untuk menambah / memperbarui file / direktori dengan baik:

Contoh: Mengganti (terlepas dari tanggal file) MANIFEST.MFfile dalam file JAR. The /source/META-INFdirektori berisi MANIFEST.MFfile yang Anda ingin menempatkan ke dalam jar(zip):

7za a /tmp/file.jar /source/META-INF/

Hanya perbarui (tidak menggantikan target jika sumbernya lebih lama)

7za u /tmp/file.jar /source/META-INF/
mzsolt
sumber
-2

iya itu mungkin.

pada sistem berbasis linux cukup instal zip dan Anda dapat memanggilnya di baris perintah. lihat di halaman manual: http://linux.die.net/man/1/zip

tetapi dalam pengalaman pribadi saya, jika memungkinkan dan kompresi tidak begitu penting, ini bekerja lebih baik dengan file tar dan tar biasa.

The Surrican
sumber