Unix zip directory แต่ไม่รวมไดเรกทอรีย่อยที่เฉพาะเจาะจง (และทุกอย่างภายในไดเรกทอรี)


115

ฉันพยายามที่จะ zip ไดเรกทอรี (บน Unix ผ่าน SSH) แต่ฉันต้องแยกไดเรกทอรีย่อยสองสามรายการ (รวมถึงไฟล์และไดเรกทอรีทั้งหมดภายในไดเรกทอรีด้วย)

จนถึงตอนนี้ฉันมีสิ่งนี้:

zip -r myarchive.zip dir1 -x dir1/ignoreDir/**/* 

ที่ดูเหมือนจะไม่ทำงานแม้ว่า

ฉันก็ลอง

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/* dir1/ignoreDir2/*

อย่างไรก็ตามจะยังคงมีไดเรกทอรีย่อยอยู่ใน ignDir1 และละเว้นDir2

โครงสร้างไดเรกทอรีย่อยในไดเรกทอรีที่ฉันต้องการแยกค่อนข้างมากดังนั้นฉันไม่สามารถเพิ่มแต่ละไดเรกทอรีลงในอาร์กิวเมนต์ -x

ไม่มีใครรู้วิธีการทำเช่นนี้?


@AlexanderMills - ดูคำถามนี้
jww

คำตอบ:


130

ฉันสนิทกันมาก!

คำสั่งจริงที่ฉันต้องการคือ:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/**\* dir1/ignoreDir2/**\*

เยี่ยมและขอบคุณที่ติดตาม! คุณสามารถยอมรับคำตอบของคุณเองได้
Daniel H

2
สิ่งนี้ไม่ได้ผลสำหรับฉันใน osx คำตอบ @pathfilder ทำแม้ว่า
rynop

11
แทนสิ่งนี้: -x dir1 / ละเว้นDir1 / ** \ *, คุณสามารถทำได้: -x dir1 / ละเว้นDir1 / \ *
Richard Gomes

67

สำหรับระบบเฉพาะของฉันเพื่อที่จะยกเว้นไดเรกทอรีฉันต้องใส่เครื่องหมายคำพูดรอบ ๆ ไดเรกทอรีที่ไม่รวมของฉันและมันทำงานได้อย่างมีเสน่ห์:

zip -r myarchive.zip dir1 -x "dir1/ignoreDir1/*" "dir1/ignoreDir2/*"

หมายเหตุ:

- สิ่งนี้ยกเว้นทั้งไดเรกทอรีที่จะแยกและไฟล์ทั้งหมดที่อยู่ในนั้น

- คุณต้องใช้เส้นทางแบบเต็มไปยังไดเรกทอรีที่คุณต้องการยกเว้น!


5
นี่คืออันที่ทำงานบน Mac OS :-)
Physicalattraction

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

ฉันคิดว่าเดิมสาเหตุหนึ่งที่ทำให้งานนี้เป็นเพราะใน Mac OS มีช่องว่างในไดเรกทอรีของฉันและสิ่งนี้หลีกเลี่ยงต้องมี \
pathfinder

ขอบคุณสำหรับการล้างข้อมูลใน @zagrimsan ทั้งสองแก้ไขปัญหาและอธิบายเหตุผลเพื่อให้เราเข้าใจ (ซึ่งจะเป็นประโยชน์ในอนาคตสำหรับสิ่งอื่น ๆ ) 👍
Synetech

8

@sulman ใช้:

     zip -r myarchive.zip dir1 -x dir1 / ละเว้นDir1 / ** \ * dir1 / ละเว้นDir2 / ** \ *

จะยังคงรวมโฟลเดอร์ dir1 / ละเว้นDir1 / empty ในไฟล์ zip โดยใช้:

     zip -r myarchive.zip dir1 -x dir1 / ละเว้นDir1 ** dir1 / ละเว้นDir2 **

จะทำเคล็ดลับคุณยังสามารถใช้ ** นำหน้าเพื่อค้นหาในโฟลเดอร์ย่อยแทน dir1 เท่านั้น


อาโอเค! ขอบคุณสำหรับการส่องสว่างนี้!
sulman

7

ต่อไปนี้จะทำ

zip -r myarchive.zip dir1 -x dir1 / ละเว้นDir1 \ * dir1 / ละเว้นDir2 \ *

**@sulman คุณต้องการอะไร?

มันใช้งานได้อย่างมีเสน่ห์สำหรับฉันดังต่อไปนี้:

[root@ip-00-000-000-000 dir1]# ls -lrt dir1/ 
total 16
drwxr-xr-x 2 root root 4096 Oct 31 07:38 ignoredir1
drwxr-xr-x 2 root root 4096 Oct 31 07:38 ignoredir2
drwxr-xr-x 2 root root 4096 Oct 31 07:39 dir3
-rw-r--r-- 1 root root    8 Oct 31 07:39 test.txt

[root@ip-00-000-000-000 temp]# zip -r dir1.zip dir1 -x dir1/ignoredir1\* dir1/ignoredir2\*
  adding: dir1/ (stored 0%)
  adding: dir1/dir3/ (stored 0%)
  adding: dir1/dir3/test3.txt (deflated 13%)
  adding: dir1/test.txt (stored 0%)

ฉันไม่รู้ว่าทำไมถึงจำเป็น ** บางทีคนอื่นอาจทำให้บางสิ่งบางอย่างในเรื่องนี้?
sulman

ขออภัย @sulman ฉันพิมพ์ผิด สิ่งที่ฉันหมายถึงคือตามแก้ไขล่าสุดของฉัน ทำงานเช่นเสน่ห์สำหรับฉัน :)
ericn

1

เช่นเดียวกับคำตอบอื่น ๆ แต่ไม่รวมไดเรกทอรีทั้งหมดแทนที่จะยกเว้นเนื้อหาทั้งหมดของไดเรกทอรี:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/\* dir1/ignoreDir2/\*

0

ฉันพบสิ่งนี้เพื่อทำงานจากDavid R Heffelfinger :

zip -r myarchive.zip dir1 -x dir1/ignoreDir1\* dir1\ignorDir2\*

มันไม่รวมไดเรกทอรีและเนื้อหา


แบ็กสแลชระหว่างdir1และignorDir2หมายถึงการเป็นสแลชต่อไป คุณหมายถึงว่าแบ็กสแลชตัวอื่นเป็นแบ็กสแลชหรือไม่? ถ้าคุณทำเช่นนั้นคุณเพิ่งคัดลอกคำตอบของฟัซซีบีเมื่อสองปีก่อน
G-Man

-1

สำหรับผมทำงาน: ซิป -9 -r ~ / folded.zip ออนไลน์ -x โฟลเดอร์ / folder2 / folder3 / foldern / \ *

ดูเหมือนว่าเครื่องหมายดอกจันจะต้องหลบหนี


2
สิ่งนี้แตกต่างจากโซลูชันของ Rick Ehrahrt เมื่อปีที่แล้วหรือ Eric's (อีกไม่กี่ปีที่ผ่านมา) โปรดอ่านวิธีแก้ปัญหาที่ให้ไว้ก่อนโพสต์ใหม่ ...
zagrimsan

เพราะฉันเพิ่มแบ็กสแลชไว้ก่อนหน้าเครื่องหมายดอกจัน (นั่นคือเพื่อหนีเครื่องหมายดอกจัน) ในรุ่น linux ที่ทำงานของฉันไม่ทำงานถ้าฉันไม่ทำเช่นนั้น
Francisco M

นอกจากนี้ Rick Ehrahrt (2014) และ eric (2012) ได้โพสต์โซลูชันเดียวกัน (เพื่อหนีเครื่องหมายดอกจัน) ไม่มีอะไรผิดปกติกับการแก้ปัญหา แต่การโพสต์เหมือนกันหลายครั้งไม่สมเหตุสมผลเว้นแต่จะสามารถเพิ่มความลึกให้กับการแก้ปัญหาด้วยการอธิบายว่าทำไมการแก้ปัญหาทำงาน ในกรณีอย่างง่ายเช่นนี้ไม่มีอะไรที่จะต้องอธิบายเพิ่มเติม โปรดอย่าใช้สิ่งนี้เป็นการส่วนตัวความตั้งใจเพียงอย่างเดียวของฉันที่นี่คือการช่วยให้ SU สะอาดและรัดกุมเพื่อให้ผู้ใช้สามารถค้นหาทางออกที่ดีที่สุดด้วยความพยายามน้อยที่สุด
zagrimsan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.