จะรวม / รวมไฟล์ zip อย่างไร


21

ในช่วงหลายเดือนที่ผ่านมาฉันได้คัดลอกโฟลเดอร์ข้อมูลหลายไฟล์ไปยังไฟล์ zip ทุกสัปดาห์ ตอนนี้ฉันต้องการรวมไฟล์ zip เหล่านั้นเป็นไฟล์ zip เดียวเพราะเนื้อหาส่วนใหญ่ของไฟล์ zip ที่มีอยู่เป็นไฟล์ข้อมูลรุ่นเดียวกันหลาย ๆ รุ่น

ดังนั้นหากไฟล์ปรากฏในไฟล์ zip มากกว่าหนึ่งไฟล์ฉันต้องการให้เวอร์ชันใหม่ล่าสุดอยู่ในไฟล์ zip ใหม่ที่กำลังสร้าง แน่นอนว่าถ้าไฟล์ปรากฏในไฟล์ zip ที่มีอยู่เพียงไฟล์เดียวฉันก็ต้องการมันในไฟล์ zip สุดท้ายด้วย

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

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


1
zipmerge สำหรับผู้ชนะ
Code Bling

คำตอบ:


7

คุณจะไม่ชอบ แต่: การซิปทุกอย่างลงในโฟลเดอร์ทำงานตามลำดับที่ถูกต้องจากนั้นการซิปผลลัพธ์เป็นวิธีที่มีประสิทธิภาพมากที่สุด

ไม่เช่นนั้นคุณจะได้รับรอบ CPU ที่สูญเปล่าไปมากมาย:

  • สมมติว่าผลลัพธ์ของคุณไปที่ 'first.zip'
  • ทุกไฟล์จาก '2.zip', '3.zip' ฯลฯ จะต้องทำการคลายซิปแล้วบีบอัดอีกครั้งใน 'first.zip'
  • ใน '2.zip' มีไฟล์ 'foobar.txt' และใน '3.zip' มีไฟล์อื่นอยู่ 'foobar.txt' การรวมในแบบที่คุณต้องการผสานนำไปสู่ ​​'บีบอัดมัน X ครั้ง'
  • toc ของ. zip อยู่ท้ายไฟล์: คุณเพิ่มเนื้อหาเพิ่มเติม (ตรงกลางของ
    . zip โดยอัพเดทไฟล์ที่อยู่ตรงกลาง) และไฟล์ทั้งหมดจะต้องถูกเขียนใหม่

ดังนั้น imho ใช้ ' unzip ' wiseley:

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

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


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

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

"ทุกไฟล์จาก '2.zip', '3.zip' ฯลฯ จะต้องทำการคลายซิปแล้วซิปอีกครั้งใน 'first.zip'" ไม่ถูกต้อง zipmergeผสานยูทิลิตี้ ZIP เก็บได้โดยไม่ต้องคลายและบีบอัดอีกครั้งตัวอย่างเช่น
ZachB

ฉันใช้unzipping/ zippingไม่uncompress / decompressใช้ ใช่เห็นได้ชัดว่าใครสามารถรับหนึ่งรายการของ2.zip(หยดที่บีบอัด) และโอนไปยังfirst.zipและจึงไม่มี "การบีบอัด" จะต้องเกิดขึ้น แต่คุณต้องแยก blob จาก2.zipค้นหา existance ใน TOC ของ first.zipถ้ามันมีทั้งแทนที่รายการที่มีอยู่ (ซึ่งหมายความว่าคุณต้องเขียนไฟล์ทั้งหมดโดยทั่วไป) หรือผนวกท้าย - และหลังจากนั้นคุณต้อง ผนวก toc ของ zip ฉันไม่เห็นวิธีการที่zipmergeสามารถบรรลุการควบรวมกิจการของซิปรายการในวิธีที่แตกต่างกัน (การบีบอัดกัน)
อากิระ

-1 เนื่องจากมีวิธีที่มีประสิทธิภาพมากกว่าในการทำงานนี้และไม่มีเหตุผลใด ๆ สำหรับสิ่งนี้ว่าเป็น "วิธีที่มีประสิทธิภาพมากที่สุด" ทำให้รู้สึกถึงความรู้สึกเพียงเล็กน้อย every file [...] has to be unzipped and then zipped again- ไม่นั่นคือสิ่งที่โซลูชันของคุณทำ 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'- ไม่เลย ทำไมมันจะ? you add more content [...] and the whole file has to be rewritten- ไม่คุณเขียนผลลัพธ์ในครั้งเดียว ทำไมไม่มีใครโหวตสิ่งนี้
benrg

4

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

ยังมีลักษณะที่zipmerge


4
-gเพิ่มไฟล์ลงในไฟล์ zip ที่มีอยู่ มันไม่ได้รวมพวกเขา เช่นzip -g result.zip other.zipจะเพิ่มไฟล์other.zipลงใน result.zip . --grow Grow (ต่อท้าย) ไฟล์ zip ที่ระบุแทนการสร้างไฟล์ใหม่ หากการดำเนินการนี้ล้มเหลว zip จะพยายามกู้คืนไฟล์เก็บถาวรเป็นสถานะดั้งเดิม หากการกู้คืนล้มเหลวการเก็บถาวรอาจเสียหาย ตัวเลือกนี้จะถูกละเว้นเมื่อไม่มีไฟล์เก็บถาวรที่มีอยู่หรือเมื่อสมาชิกถาวรอย่างน้อยหนึ่งสมาชิกต้องอัปเดตหรือลบออก '
akira


2

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

zipmerge ผสานจดหมายเหตุแหล่งซิปลงในไฟล์source-zip zip เป้าหมาย target-zipตามค่าเริ่มต้นไฟล์ในไฟล์ zip ที่เก็บถาวรจะเขียนทับไฟล์ที่มีอยู่ในชื่อเดียวกันในไฟล์ zip เป้าหมาย


1

ฉันคิดว่าคุณสามารถสคริปต์ไฟล์ที่ถูกแยกลงในไดเรกทอรีชั่วคราว

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

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

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

หากต้องการเปลี่ยนสิ่งนี้เพื่อใช้โปรแกรมคลายซิปอื่นเพียงแค่แทนที่"c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoaด้วยคำสั่งอะไรก็ตามที่คุณจะเรียกใช้งานในแต่ละไฟล์ ใช้%fเป็นตัวยึดตำแหน่งสำหรับชื่อไฟล์ที่คุณต้องการคลายซิป

ฉันพยายามหาแอปที่ขัดเงาฟรีหรืออย่างอื่นและไม่พบแอปใดแอปหนึ่ง

หวังว่านี่จะเป็นการเริ่มต้นที่ดีและ WinZip หรือสิ่งที่คล้ายกันสามารถดูแลปัญหาการเขียนทับได้

โชคดี.


0

ถ้าฉันจำได้อย่างถูกต้องpkzipเป็นโปรแกรมบรรทัดคำสั่ง

ยังคงมี ZIP เวอร์ชันบรรทัดคำสั่งที่อ้างว่าใช้งานได้กับ pkzip

มันเรียกว่าInfo-ZIPและควรมีเวอร์ชั่นสำหรับระบบปฏิบัติการของคุณ


มีฟังก์ชั่นที่ฉันถามหรือไม่ ฉันไม่สามารถค้นหาความสามารถนี้ได้จากที่ใด
CChriss

1
ชุด Info-Zip ทำให้ไฟล์เข้ากันได้กับ PKZip แต่ตัวโปรแกรมเองนั้นแตกต่างกันและดูเหมือนจะไม่รวมตัวเลือกการผสาน
CarlF

ตกลงขออภัยฉันสามารถรวบรวมและเรียกใช้ Info-Zip บนเวิร์กสเตชัน Apollo ภายใต้ DOMAIN / OS หลายปีที่ผ่านมา ฉันจำได้ว่ามันมีคุณสมบัติที่แตกต่างกันใน DOS / VMS / Unix และคุณสมบัติอื่น ๆ ฉันคิดว่ามันอาจมีการพัฒนาต่อไป
pavium

0

ค้นหาบรรทัดคำสั่ง winzip บนเน็ต Winzip มีเครื่องมือบรรทัดคำสั่งหลายเวอร์ชันเพื่อให้เหมาะกับ winzip ทุกรุ่นที่คุณอาจติดตั้ง เครื่องมือบรรทัดคำสั่ง WZZIP มีตัวเลือก -f "freshen" ซึ่งจะทำการซิปไฟล์ที่ใหม่กว่าเฉพาะไฟล์ที่ตรงกับชื่อของไฟล์ในไฟล์ zip เอาต์พุตการสรุป

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

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