คำสั่งเพื่อบีบอัดหลายไดเรกทอรีลงในไฟล์ซิปแยก


40

ฉันมีไดเรกทอรีเดียวที่มีหลายสิบไดเรกทอรีอยู่ข้างใน

ฉันใหม่สำหรับบรรทัดคำสั่งและฉันกำลังพยายามหาคำสั่งที่จะบีบอัดไดเรกทอรีย่อยแต่ละรายการให้เป็นไฟล์ย่อยไดเรกทอรีที่ไม่ซ้ำกัน

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

เป็นไปได้อย่างนี้ไหม? ถ้าเป็นเช่นนั้นโปรดแสดงให้ฉันเห็นว่ามันเสร็จสิ้นแล้ว


ฉันขอแนะนำให้คุณค้นหาวิธี "ลูป" สามารถทำได้ในเปลือก มีผู้สร้างออนไลน์ที่สามารถทำสิ่งที่คุณต้องการได้ แต่การวนซ้ำที่ดีจะมีความชัดเจนมากขึ้น
lynxlynxlynx

นั่นหมายความว่าฉันต้องเขียนเชลล์สคริปต์แยกต่างหากจากนั้นเรียกสคริปต์นั้นจากบรรทัดคำสั่ง? ขออภัยสำหรับคำถามเบื้องต้น แม้ว่าฉันจะมีประสบการณ์การเขียนโปรแกรมบางสิ่งนี้เป็นของใหม่สำหรับฉัน
Evster

คำตอบ:


75

คุณสามารถใช้วงนี้ในbash:

for i in */; do zip -r "${i%/}.zip" "$i"; done

iเป็นชื่อของตัวแปรลูป */หมายถึงทุกไดเรกทอรีย่อยของไดเรกทอรีปัจจุบันและจะรวมเครื่องหมายสแลชต่อท้ายในชื่อเหล่านั้น ตรวจสอบให้แน่ใจว่าคุณcdถูกที่แล้วก่อนดำเนินการสิ่งนี้ "$i"เพียงแค่ชื่อไดเรกทอรีนั้นรวมถึงสแลชต่อท้าย เครื่องหมายคำพูดให้แน่ใจว่าช่องว่างในชื่อไดเรกทอรีจะไม่ทำให้เกิดปัญหา ${i%/}เป็นเหมือน$iแต่มีการลบเครื่องหมายสแลชต่อท้ายดังนั้นคุณสามารถใช้เพื่อสร้างชื่อของไฟล์ซิป

หากคุณต้องการดูวิธีการทำงานรวมถึงechoก่อนzipและคุณจะเห็นคำสั่งที่พิมพ์แทนการดำเนินการ


ขอบคุณมันดูดีมาก! อย่างไรก็ตามหนึ่งปัญหาที่อาจเกิดขึ้นฉันคิดว่า: นี้จะ zip ทุกไดเรกทอรีในแต่ละไดเรกทอรีย่อยเป็นไฟล์แยกกันหรือไม่ ฉันต้องการซิปไดเรกทอรีย่อยระดับที่ 1 เป็นไฟล์บีบอัดเดียว ฉันไม่ต้องการสร้างไฟล์ zip เพิ่มเติมสำหรับไดเรกทอรีย่อยระดับที่ 2 ระดับที่ 3 ฯลฯ โปรดแจ้งให้เราทราบหากเหมาะสม ขอบคุณอีกครั้ง!
Evster

เฉพาะเลเวลแรกเท่านั้นที่คุณต้องการ
lynxlynxlynx

*/ชื่อทุกไดเรกทอรีย่อยโดยตรงไม่ได้ทุกไดเรกทอรีลูกหลาน ดังนั้นคุณจะได้รับรหัสไปรษณีย์สำหรับระดับบนสุดตามแบบที่คุณต้องการ รุ่นที่มีechoในนั้นจะได้แสดงให้เห็นถึงแง่มุมนั้น การบีบอัดไดเรกทอรีที่ซ้อนกันทั้งหมดลงในไฟล์ของตัวเองจะใช้งานได้จริงกว่าและอาจแก้ไขได้ดีที่สุดเมื่อใช้find -type dกับเทคนิคอื่น
MvG

1
@fritzmg: การทดสอบในระบบบนลีนุกซ์ของฉันแสดงให้เห็นว่าใช่ไฟล์ที่เริ่มต้นด้วยจุดนั้นรวมอยู่ด้วย นี่จะเป็นคุณสมบัติของเครื่องมือ Info-ZIP ไม่ใช่คำสั่งที่ฉันให้ดังนั้นขึ้นอยู่กับว่าzipไบนารีของคุณคืออะไรคุณอาจได้รับพฤติกรรมที่แตกต่างกัน เพื่อสร้างไฟล์ซิปสำหรับไดเรกทอรีระดับบนสุด (เช่นลูกของไดเรกทอรีปัจจุบัน) ที่ขึ้นต้นด้วยจุดคุณสามารถใช้shopt -s dotglobเพื่อทำให้รูปแบบกลมตรงกับไฟล์ที่ซ่อนเช่นกัน
MvG

1
เพื่อสร้าง zip ที่ไม่มีไดเรกทอรีหลักเป็นรูต:for i in */; do (cd "$i"; zip -r "../${i%/}.zip" .); done
chris
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.