ลบไฟล์เดียวจากไฟล์เก็บถาวร zip บน Linux


75

ฉันมีไฟล์เก็บถาวร zip (สร้างโดยอัตโนมัติในสคริปต์ที่มี-j -rค่าสถานะ) และฉันต้องการลบไฟล์เดียวออกจากไฟล์ ฉันพยายามทำเป็นเอกสารแล้ว

zip -d "picture_43_9.jpg" gallery.zip

แต่ฉันได้รับข้อผิดพลาดนี้:

zip warning: picture_43_9.jpg not found or empty   
zip error: Nothing to do! (picture_43_9.jpg)  

อย่างไรก็ตามมีเป็นไฟล์ดังกล่าวภายในการจัดเก็บและมันไม่ได้เป็นที่ว่างเปล่า

unzip -l .../gallery.zip | grep -i 43_9.jpg  
1477092  2013-05-22 14:23   picture_43_9.jpg 

มีความคิดเห็นเกี่ยวกับสิ่งที่ฉันทำผิดหรือเปล่า?

คำตอบ:


103

คุณมีการแลกเปลี่ยนข้อโต้แย้ง ลองสิ่งนี้:

zip -d gallery.zip "picture_43_9.jpg" 

จากหน้าคนzip (1) :

-d
--delete
ลบ (ลบ) รายการจากไฟล์ zip ตัวอย่างเช่น:

zip  -d  foo  foo/tom/junk  foo/harry/\*  \*.o

จะลบรายการfoo/tom/junkไฟล์ทั้งหมดที่ขึ้นต้นด้วย foo/harry/และไฟล์ทั้งหมดที่ลงท้ายด้วย.o(ในพา ธ ใด ๆ ) โปรดทราบว่าการขยายชื่อพา ธ ของเชลล์ถูกยับยั้งด้วยแบ็กสแลชเพื่อให้zipสามารถเห็นเครื่องหมายดอกจันเปิดใช้งานzipเพื่อจับคู่กับเนื้อหาของไฟล์เก็บถาวรzipแทนเนื้อหาของไดเรกทอรีปัจจุบัน (แบ็กสแลชไม่ได้ใช้กับแพลตฟอร์มที่ใช้ MSDOS) นอกจากนี้ยังสามารถใช้อัญประกาศเพื่อหนีเครื่องหมายดอกจันได้เช่นเดียวกับใน

zip -d foo foo/tom/junk "foo/harry/*" "*.o"

การไม่ใช้เครื่องหมายดอกจันบนระบบที่เชลล์ขยาย wildcards อาจส่งผลให้เครื่องหมายดอกจันถูกแปลงเป็นรายการไฟล์ในไดเร็กทอรีปัจจุบันและรายการที่ใช้เพื่อลบรายการออกจากไฟล์เก็บถาวร

ภายใต้ MSDOS, -dเป็นกรณีที่สำคัญเมื่อมันตรงกับชื่อที่อยู่ในซิปเก็บ สิ่งนี้ต้องการให้ชื่อไฟล์ถูกป้อนเป็นตัวพิมพ์ใหญ่หากถูกซิปโดย PKZIP บนระบบ MSDOS (เราได้พิจารณาการทำกรณีนี้ตายบนระบบที่เส้นทางเป็นกรณีตาย แต่ก็เป็นไปได้ที่เก็บมาจากระบบที่กรณีที่ไม่สำคัญและเก็บอาจรวมถึงทั้งสองBarและbar เป็นไฟล์แยกต่างหากในการเก็บ.) แต่เห็นตัวเลือกใหม่- icเพื่อละเว้นกรณีและปัญหาในที่เก็บถาวร


คุณขวาขอบคุณผมได้สับสนโดยความช่วยเหลือบรรทัดคำสั่งของซิป zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
อเล็กซ์โฟล

@AlexFlo: คุณอาจมีสำเนาหน้าคนไม่ดี สำเนาที่อ้างถึงข้างต้นระบุว่า“ [ zipfile [ file … ]]” ซึ่งหมายความว่าคุณสามารถมี (a) ไม่มีชื่อไฟล์ที่ขัดแย้งได้เลย (แม้ว่าฉันจะไม่ทราบวิธีการที่สามารถใช้งานได้นอกเหนือจากเมื่อคุณขอความช่วยเหลือ ), (b) ชื่อzipfile (ไฟล์เก็บถาวร) เท่านั้นหรือ (c) ชื่อzipfile ตามด้วยชื่อไฟล์ธรรมดาหนึ่งชื่อขึ้นไป (สิ่งเหล่านี้สามารถเป็นชื่อของไฟล์จริงที่จะแทรกลงในไฟล์เก็บถาวรหรือชื่อของสมาชิกไฟล์เก็บถาวรที่จะจัดการ)
Scott

@AlexFlo - คุณสามารถส่งต่ออาร์กิวเมนต์ชื่อไฟล์ผ่าน STDIN และไปยัง pip ได้zipตามที่ระบุไว้ใน man page ที่คุณอ้างถึง ตัวอย่างเช่นหากคุณอยู่ในไดเรกทอรีที่มีfile1.txt, file2.txtและfile3.txtคุณสามารถดำเนินการls -1 | zip -q 'files.zip' -@ได้ซึ่งจะสร้างไฟล์เก็บถาวรfiles.zipที่มีไฟล์ 3 ไฟล์ที่คุณไพพ์zipด้วยโดยชื่อไฟล์จะยังคงอยู่
rubynorails
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.