วิธีอัปเดตไฟล์เดียวในไฟล์ zip


88

เป็นไปได้ไหมที่จะแทนที่ไฟล์ในไฟล์ zip โดยไม่ต้องคลายซิปลบไฟล์เก่าโดยเพิ่มไฟล์ใหม่แล้วซิปกลับ

เหตุผลคือฉันมีไฟล์ zip ซึ่งใหญ่มากมี xml หนึ่งไฟล์อยู่ในไฟล์ zip ที่ฉันต้องอัปเดตบางครั้ง การคลายซิปแล้วรูดซิปใหม่ใช้เวลานาน ดังนั้นฉันต้องการเพียงแค่สามารถแทนที่หนึ่ง xml ภายใน zip ผ่านสคริปต์ ฉันได้ตรวจสอบการอัปเดตบน xml ที่ฉันมีอยู่แล้ว

ดังนั้นเป็นไปได้ไหมที่จะแทนที่ xml หนึ่งตัวโดยไม่ต้องคลายซิปแล้ว

ขออภัยฉันจะใช้คำสั่ง zip เพื่อทำสิ่งต่างๆเช่นนั้น แต่ปัญหาคือสคริปต์นั้นใช้สำหรับโทรศัพท์ Android และ zip ไม่ใช่คำสั่งที่ฉันสามารถใช้ได้ขออภัยที่ฉันทิ้งมันไป ฉันจะใช้ zip อย่างแน่นอนถ้าทำได้ แต่ฉันเปิดเครื่องรูดสำหรับ droid เท่านั้นจากนั้นมี tar ใน busybox แต่ tar ไม่ทำในสิ่งที่ฉันต้องการ


3
คุณสามารถเปลี่ยนชื่อคำถามให้มีความหมายมากขึ้นได้ไหม
tokland

7
นอกจากนี้คำถามอาจเป็นหนึ่งหรือสองประโยค ประมาณ 80% ของมันกำลังเดินเตร่
Dennis Williamson

คำตอบ:


63

จากซิป (1) :

เมื่อได้รับชื่อของไฟล์ zip ที่มีอยู่ zip จะแทนที่รายการที่มีชื่อเหมือนกันในไฟล์ zip หรือเพิ่มรายการสำหรับชื่อใหม่

ดังนั้นเพียงใช้zipคำสั่งตามปกติในการสร้างไฟล์. zip ใหม่ที่มีไฟล์นั้นเพียงไฟล์เดียวยกเว้นชื่อไฟล์. zip ที่คุณระบุจะเป็นไฟล์เก็บถาวรที่มีอยู่


5
ใครช่วยยกตัวอย่างได้ไหม ฉันไม่เข้าใจความช่วยเหลือของคำสั่ง zip
Gustave

12
สมมติว่าคุณซิป myfolder โดยใช้zip -r myfolder.zip myfolderถ้าคุณต้องการอัปเดตmyfolder/otherfolder/myfile.txtให้แก้ไขไฟล์และเรียกใช้zip -r myfolder.zip myfolder/otherfolder/myfile.txt
eakkas

1
จะทำอย่างไรหากไฟล์ที่จะแทนที่ไม่มีชื่อเดียวกันหรือโครงสร้างเดียวกันกับไฟล์ที่จะเปลี่ยนใหม่
Fractaliste

2
@Fractaliste คุณต้องทำให้มันมีชื่อและโครงสร้างเดียวกัน;)
Hack5

75

ฉันพบว่าzipไฟล์Linux ยุ่งยากสำหรับการแทนที่ไฟล์เดียวใน zip jarยูทิลิตี้จาก Java Development Kit อาจจะง่าย พิจารณางานทั่วไปในการอัปเดตWEB/web.xmlในไฟล์ JAR (ซึ่งเป็นเพียงไฟล์ zip):

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

นี่path/to/dirคือเส้นทางไปยังไดเร็กทอรีที่มีWEB-INFไดเร็กทอรี (ซึ่งจะมีweb.xml)


จะเกิดอะไรขึ้นถ้าฉันต้องคัดลอกเฉพาะไฟล์แทนที่จะสร้างไดเร็กทอรีWEB-INFที่มีไฟล์นั้น
ช่วยมือ

นอกจากนี้ในกรณีของฉันผู้ใช้ "โถ" ที่รักเก่าทำเคล็ดลับ! ขอบคุณ!
bitfox

52

ลองทำดังต่อไปนี้:

zip [zipfile] [file to update] 

ตัวอย่าง:

$ zip test.zip test/test.txt
updating: test/test.txt (stored 0%)

2
นี่เป็นตัวอย่างที่เข้าใจง่ายที่สุดขอบคุณ!
vatsug

2
คำนึงถึงสิ่งที่คุณควรเห็นupdating:แทนadding:ว่าคุณต้องการอัปเดตไฟล์ภายใน zip หรือไม่ มิฉะนั้นคุณจะเพิ่มไฟล์ลงใน zip โดยไม่ได้แทนที่
Edenshaw

คุณพูดถูกฉันไม่ได้สังเกตเห็นสิ่งนั้น อัปเดตแล้วขอบคุณ!
WizardsOfWor

13

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันก็อยากจะทำเหมือนกัน อัปเดตไฟล์ในไฟล์ zip และไม่มีคำตอบข้างต้นช่วยฉันได้จริง

นี่คือสิ่งที่ฉันทำ abcไดเรกทอรีชั่วคราวที่สร้างขึ้น คัดลอกfile.zipไปabcและสกัดไฟล์ในไดเรกทอรีที่ ฉันแก้ไขไฟล์ที่ต้องการแก้ไข จากนั้นในขณะที่อยู่abcให้รันคำสั่งต่อไปนี้

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

-u สวิตช์จะค้นหาไฟล์ที่เปลี่ยนแปลง / ใหม่และจะเพิ่มลงในไฟล์ zip


12

ใช้แฟล็กอัพเดต: -u

ตัวอย่าง:

zip -ur existing.zip myFolder

คำสั่งนี้จะบีบอัดและเพิ่มmyFolder(และเป็นเนื้อหา) ในไฟล์existing.zip.


การใช้งานขั้นสูง:

แฟล็กการอัปเดตจะเปรียบเทียบไฟล์ขาเข้ากับไฟล์ที่มีอยู่และจะเพิ่มไฟล์ใหม่หรืออัปเดตไฟล์ที่มีอยู่

ดังนั้นหากคุณต้องการเพิ่ม / อัปเดตไดเร็กทอรีย่อยเฉพาะภายในไฟล์ zip ให้อัปเดตซอร์สตามต้องการจากนั้นซิปซอร์สทั้งหมดอีกครั้งด้วย-uแฟล็ก เฉพาะไฟล์ที่เปลี่ยนแปลงเท่านั้นที่จะถูกบีบอัด

หากคุณไม่มีสิทธิ์เข้าถึงไฟล์ต้นฉบับคุณสามารถคลายซิปไฟล์ zip จากนั้นอัปเดตไฟล์ที่ต้องการจากนั้น zip ใหม่ด้วย-uแฟล็ก อีกครั้งเฉพาะไฟล์ที่เปลี่ยนแปลงเท่านั้นที่จะถูกบีบอัด

ตัวอย่าง:

โครงสร้างแหล่งที่มาเดิม


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

ปรับปรุงโครงสร้างแหล่งที่มา


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

การใช้งาน

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


1

นอกจากนี้ยังมีตัวเลือก -f ที่จะทำให้ไฟล์ zip สดใหม่ สามารถใช้เพื่ออัปเดตไฟล์ทั้งหมดที่ได้รับการอัปเดตตั้งแต่สร้าง zip (สมมติว่าอยู่ในที่เดียวกันภายในโครงสร้างโครงสร้างภายในไฟล์ zip)

หากไฟล์ของคุณชื่อ /myfiles/myzip.zip สิ่งที่คุณต้องทำคือ

zip -f /myfiles/myzip.zip

0

จากด้านข้างของโครงสร้างไฟล์ ZIP - คุณสามารถอัปเดตไฟล์ zip ได้โดยไม่ต้องบีบอัดซ้ำคุณเพียงแค่ต้องข้ามไฟล์ทั้งหมดที่อยู่ก่อนหน้าไฟล์ที่คุณต้องการแทนที่จากนั้นใส่ไฟล์ที่อัปเดตแล้วจากนั้นจึงทำการอัปเดตไฟล์ที่เหลือ และสุดท้ายคุณจะต้องใส่โครงสร้างไดเร็กทอรี centeral ที่อัปเดต อย่างไรก็ตามฉันสงสัยว่าเครื่องมือทั่วไปส่วนใหญ่จะช่วยให้คุณทำสิ่งนี้ได้


0

7zip (7za) สามารถใช้สำหรับเพิ่ม / อัปเดตไฟล์ / ไดเร็กทอรีได้อย่างดี:

ตัวอย่าง: การแทนที่ (โดยไม่คำนึงถึงวันที่ของไฟล์) MANIFEST.MFไฟล์ในไฟล์ JAR /source/META-INFไดเรกทอรีที่มีMANIFEST.MFแฟ้มที่คุณต้องการที่จะใส่ลงไปในjar(ไปรษณีย์):

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

อัปเดตเท่านั้น (ไม่แทนที่เป้าหมายหากแหล่งข้อมูลเก่ากว่า)

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

-2

ใช่มันเป็นไปได้

บนระบบที่ใช้ linux เพียงแค่ติดตั้ง zip และคุณสามารถเรียกใช้งานได้ในบรรทัดคำสั่ง ดู manpage: http://linux.die.net/man/1/zip

แต่จากประสบการณ์ส่วนตัวของฉันถ้าเป็นไปได้และการบีบอัดไม่สำคัญสิ่งนี้จะทำงานได้ดีขึ้นกับไฟล์ tar ธรรมดาและ tar

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.