บีบอัดไฟล์ zip ของ Mac โดยไม่มีโฟลเดอร์ __MACOSX หรือไม่


158

เมื่อฉันบีบอัดไฟล์ด้วย zip zip ในตัวใน Mac OSX มันจะส่งผลให้มีโฟลเดอร์พิเศษชื่อ "__MACOSX" ที่สร้างขึ้นใน zip ที่แตกออกมา

ฉันสามารถปรับการตั้งค่าเพื่อป้องกันไม่ให้สร้างโฟลเดอร์นี้หรือฉันต้องการซื้อเครื่องมือบีบอัดของบุคคลที่สามหรือไม่?

UPDATE : ฉันเพิ่งพบแอพฟรีแวร์สำหรับ OSX ที่แก้ปัญหาของฉัน: " YemuZip "

อัพเดท 2 : YemuZip ไม่ได้เป็นฟรีแวร์อีกต่อไป


การมีอยู่ของโฟลเดอร์ _MACOSX ไม่ได้สร้างปัญหาใด ๆ เพียงลบ
Jayprakash Dubey

1
คำถามนี้ดูเหมือนจะไม่เป็นหัวข้อเพราะควรอยู่ใน AskDifferent
Nakilon

11
มันสร้างปัญหากับบริการเว็บที่มีพิถีพิถันที่ต้องการไฟล์ zip ที่เก่าแก่ดังนั้นฉันรู้สึกขอบคุณสำหรับคำอธิบาย
mccc

21
@JayprakashDubey มัน incredibily เกิดการระคายเคืองและเป็นผู้ใช้ลินุกซ์ที่ชอบไม่ได้ออกจากถังขยะทุกที่ที่ฉันไปฉันไม่สามารถยืน__MACOSX, .DS_Store, ._fileNameและทุก turds สารพันอื่น ๆ Mac OS ลดลงในคลังของ `tar 'ของ OSX ทำเช่นนี้เช่นกัน - โดยไม่สนใจหลักการที่น่าประหลาดใจน้อยที่สุด
Wyatt8740

คำตอบ:


80

เมื่อฉันมีปัญหานี้ฉันได้ทำจากบรรทัดคำสั่ง:

zip file.zip uncompressed

แก้ไขหลังจาก downvotes หลายตัว: ฉันใช้ตัวเลือกนี้เมื่อไม่นานมานี้และไม่รู้ว่าฉันเรียนที่ไหนฉันจึงไม่สามารถให้คำอธิบายที่ดีกว่าได้ คำตอบของ Chris Johnson นั้นถูกต้อง แต่ฉันจะไม่ลบของฉัน ในฐานะที่เป็นหนึ่งความคิดเห็นกล่าวว่ามันถูกต้องมากขึ้นกับสิ่งที่ OP ขอให้มันบีบอัดโดยไม่มีไฟล์เหล่านั้นแทนที่จะลบออกจากไฟล์บีบอัด ฉันพบว่ามันง่ายต่อการจดจำเช่นกัน


33
สิ่งนี้ขาดคำอธิบาย
Raptor

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

ดูคำตอบของฉันสำหรับวิธีง่าย ๆ ในการลบโฟลเดอร์ _MACOSX หลังจากสร้างไฟล์ zip
Chris Johnson

3
เพื่อบีบอัดไดเรกทอรีซ้ำโดยไม่ต้อง __MACOSX และอื่น ๆ :zip -rX file.zip uncompressed_directory
Konstantin Suvorov

319

สามารถแก้ไขได้ตามความเป็นจริงโดย zip -d filename.zip __MACOSX/\*


51
เพื่อลบไฟล์. DS_Store ด้วย:zip -d filename.zip \*/.DS_Store
Benedikt Köppel

5
คำตอบที่ได้รับการยอมรับบอกว่าจะไม่รับไดเรกทอรี __MACOSX / ในตอนแรกได้อย่างไร แต่ไม่ได้พูดถึงสิ่งที่ต้องทำกับไฟล์. zip ที่มีอยู่ คำตอบนี้บอกวิธีกำจัด __MACOSX / ถ้าคุณได้รับมาแล้ว อย่างไรก็ตามคำถามเดิมเป็นวิธีที่จะไม่ได้รับมันในสถานที่แรกดังนั้นคำตอบที่ได้รับการยอมรับเป็นคำถามที่ถูกต้อง
Edward Falk

ฉันจะทำสิ่งนี้ซ้ำสำหรับไฟล์ zip ทั้งหมดได้อย่างไร
Wowfunhappy

วิธีนำไปใช้กับไฟล์ zip ทั้งหมดภายใต้รูทบางส่วน: find ~ -type f -name '*.zip' -exec zip -d '{}' __MACOSX/\* \;. ~แทนจุดเริ่มต้นของคุณสำหรับ
Chris Johnson

cleanzip(){ zip -d $1 $2 __MACOSX/\* \*/.DS_Store; }ฟังก์ชั่นในการลบไฟล์ขยะทั้งหมด: การใช้งาน: cleanzip file.zipหรือcleanzip file.zip MORE_JUNK_FILES(พารามิเตอร์ตัวที่สองเป็นตัวเลือก)
mrdaliri

56

ภายในโฟลเดอร์ที่คุณต้องการบีบอัดในเทอร์มินัล:

zip -r -X Archive.zip *

โดยที่ -X หมายถึง: ยกเว้นไฟล์ทรัพยากร Mac ที่มองไม่เห็นเช่น“ _MACOSX” หรือ“ ._Filename” และ. ds จัดเก็บไฟล์

แหล่ง

หมายเหตุ:จะใช้งานได้เฉพาะกับโฟลเดอร์และแผนผังโฟลเดอร์ที่ตามมาที่คุณอยู่และจะต้องมี*สัญลักษณ์แทน


9
สิ่งนี้ไม่ทำงานอย่างที่คุณคิด: -Xไม่รวมไฟล์. DS_Store เหตุผลที่อาจใช้ได้กับแอปพลิเคชันของคุณคือคุณกำลังซิปเท่านั้น*ซึ่งเป็นไฟล์จับคู่สัญลักษณ์ที่ไม่ได้ขึ้นต้นด้วย "" ลองในไดเรกทอรีที่มีไฟล์จุดและคุณจะเห็นมันได้รับการรวม
spinup

ดูคำตอบของฉันสำหรับวิธีง่าย ๆ ในการลบโฟลเดอร์ _MACOSX หลังจากสร้างไฟล์ zip
Chris Johnson

1
ไม่การทำzip -r -X Archive.zip myfolderบนโฟลเดอร์จะยังคงทำให้ไฟล์ zip มีไฟล์. DS_Store
Rockallite

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

ใช้งานได้กับไฟล์ที่อยู่ในไดเรกทอรีแทนที่จะทำการซิปโฟลเดอร์ทั้งหมด
Michael Trouw

26

คำสั่งนี้ทำเพื่อฉัน:

zip -r Target.zip Source -x "*.DS_Store"

Target.zipเป็นไฟล์ zip ที่จะสร้าง Sourceเป็นไฟล์ / โฟลเดอร์ต้นฉบับที่จะซิปขึ้น และ_xพารามิเตอร์ระบุไฟล์ / โฟลเดอร์ที่จะไม่รวม หากวิธีการด้านบนใช้ไม่ได้ด้วยเหตุผลใด ๆ ให้ลองทำสิ่งนี้แทน:

zip -r Target.zip Source -x "*.DS_Store" -x "__MACOSX"

OP ถามถึงวิธีการแยกโฟลเดอร์ __MACOSX เห็นได้ชัดว่ารหัสแรกของคุณใช้งานไม่ได้เพราะไม่ได้ระบุว่าเป็นโฟลเดอร์ที่จะยกเว้น
Chris Johnson

7
zipอรรถประโยชน์บรรทัดคำสั่งไม่เคยสร้าง__MACOSXไดเรกทอรีเพื่อให้ข้อมูลครั้งแรกไม่ทำงานและ-x "__MACOSX"ส่วนที่ไม่จำเป็น
nisetama

15

ฉันใช้ Automator Shell Script นี้เพื่อแก้ไขหลังจากนั้น มันปรากฏขึ้นเป็นรายการเมนูตามบริบท (คลิกขวาที่ไฟล์ใด ๆ ที่แสดงใน Finder)

while read -r p; do
  zip -d "$p" __MACOSX/\* || true
  zip -d "$p" \*/.DS_Store || true
done
  1. สร้างบริการใหม่ด้วย Automator
  2. เลือก "ไฟล์และโฟลเดอร์" ใน "Finder"
  3. เพิ่ม "เชลล์สคริปต์แอ็คชัน"

สคริปต์เชลล์อัตโนมัติ

รายการเมนูตามบริบทใน Finder


การบีบอัดข้อมูลโดยใช้ zip ใน Automator Shell Script จะดีกว่าการบีบอัดโดยใช้ Apple ในตัวแล้วลบไฟล์ที่ไม่ต้องการออกหรือไม่
แมตต์

@Matt คุณสามารถเพิ่มขั้นตอนการเก็บถาวรใน automator หรือใช้คำสั่ง shell อื่นได้เช่นกัน
ttimasdf

@Matt นอกจากนี้ Apple ในตัวจะจัดการตั้งชื่อไฟล์อัตโนมัติและเพิ่มชื่อเมื่อมีไฟล์อยู่ ด้วยเชลล์สคริปต์ส่วนนี้จะทำงานได้มาก
ttimasdf

1
มันจะโยนข้อผิดพลาดหากโฟลเดอร์. DS_Store ไม่ปรากฏในที่เก็บถาวร ฉันแนะนำการปรับปรุงโดยเพิ่ม `|| true` หลังจากคำสั่ง zip แต่ละคำ (เช่นzip -d "$p" __MACOSX/\* || trueในคำตอบของคุณ
adamsfamily

1
ในขณะที่คำตอบอื่น ๆ ดี แต่ฉันชอบคำนี้ดีที่สุดเพราะสามารถใช้ได้ในแบบที่เป็น Macish
not2savvy

10

โฟลเดอร์ที่ไม่ต้องการสามารถลบได้ด้วยวิธีต่อไปนี้:

zip -d filename.zip "__MACOSX*"

ทำงานได้ดีที่สุดสำหรับฉัน


8
zip -r "$destFileName.zip" "$srcFileName" -x "*/\__MACOSX" -x "*/\.*"
  • -x "*/\__MACOSX": ละเว้น __MACOSX ตามที่คุณพูดถึง
  • -x "*/\.*": ละเว้นไฟล์ที่ซ่อนอยู่ใด ๆ เช่น. DS_Store
  • อ้างอิงตัวแปรเพื่อหลีกเลี่ยงไฟล์ถ้าตั้งชื่อด้วย SPACE

นอกจากนี้คุณยังสามารถสร้างบริการอัตโนมัติเพื่อให้ใช้งานได้ง่ายใน Finder ตรวจสอบลิงค์ด้านล่างเพื่อดูรายละเอียดหากคุณต้องการ

Github


Heh คำตอบเดียวที่ถูกต้องท่ามกลางทะเลขยะก็เป็นคำตอบที่ได้คะแนนน้อยที่สุด / ถอนหายใจ
Heath Raftery

มันใช้งานได้สำหรับฉัน แต่ฉันต้องลบเครื่องหมายคำพูดรอบ ๆ และสัญลักษณ์ดอลลาร์ก่อนที่จะ destFileName.zip และ srcFileName
Alexander Poleschuk

3

zipอรรถประโยชน์บรรทัดคำสั่งไม่เคยสร้าง__MACOSXไดเรกทอรีดังนั้นคุณก็สามารถเรียกใช้คำสั่งเช่นนี้:

zip directory.zip -x \*.DS_Store -r directory

ในผลลัพธ์ด้านล่างa.zipซึ่งฉันสร้างด้วยzipยูทิลิตี้บรรทัดคำสั่งไม่มี__MACOSXไดเรกทอรี แต่a 2.zipที่ฉันสร้างจาก Finder ทำ

$ touch a
$ xattr -w somekey somevalue a
$ zip a.zip a
  adding: a (stored 0%)
$ unzip -l a.zip
Archive:  a.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
        0  01-02-16 20:29   a
 --------                   -------
        0                   1 file
$ unzip -l a\ 2.zip # I created `a 2.zip` from Finder before this
Archive:  a 2.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
        0  01-02-16 20:29   a
        0  01-02-16 20:31   __MACOSX/
      149  01-02-16 20:29   __MACOSX/._a
 --------                   -------
      149                   3 files

-x .DS_Storeไม่รวม.DS_Storeไฟล์ภายในไดเรกทอรี แต่-x \*.DS_Storeทำ

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

ยูทิลิตี้การเก็บถาวรจะสร้าง__MACOSXไดเรกทอรีเฉพาะเมื่อคุณสร้างไฟล์เก็บถาวรโดยที่อย่างน้อยหนึ่งไฟล์มีข้อมูลเมตาเช่นแอททริบิวต์ที่เพิ่มขึ้น, แฟล็กไฟล์หรือส้อมทรัพยากร __MACOSXไดเรกทอรีมีไฟล์ AppleDouble ที่มีชื่อไฟล์ที่เริ่มต้นด้วยการ._ที่ใช้ในการจัดเก็บ OS X เฉพาะเมตาดาต้า zipทิ้งอรรถประโยชน์บรรทัดคำสั่ง metadata เช่นคุณสมบัติการขยายธงไฟล์และส้อมทรัพยากรซึ่งก็หมายความว่าเมตาดาต้าเช่นแท็กจะหายไปและนามแฝงที่หยุดทำงานเนื่องจากข้อมูลในแฟ้มนามแฝงถูกเก็บไว้ในส้อมทรัพยากร

ปกติคุณก็สามารถทิ้งข้อมูลเมตา OS X-เฉพาะ xattr -lแต่จะเห็นสิ่งที่เมตาดาต้าไฟล์ประกอบด้วยคุณสามารถใช้ xattrยังรวมถึงส้อมทรัพยากรและแฟล็กไฟล์เนื่องจากแม้ว่าพวกเขาจะไม่ได้รับการจัดเก็บจริงเป็นคุณลักษณะเพิ่มเติมพวกเขาสามารถเข้าถึงได้ผ่านอินเตอร์เฟซแอตทริบิวต์เพิ่มเติม ทั้ง Archive Utility และzipยูทิลิตี้บรรทัดคำสั่งจะยกเลิก ACL


ใช้งานได้กับไดเรกทอรีเท่านั้นไม่ใช่สำหรับไฟล์หลาย ๆ ไฟล์ในไดเรกทอรี
Michael Trouw

@MichaelTrouw ใช่ แต่โดยปกติคุณไม่ควรสร้างไฟล์เก็บถาวรที่มีหลายไฟล์ในระดับบนสุดตั้งแต่แรก
nisetama

ฉันเห็นด้วยที่จะไม่เห็นด้วยเพราะมีกรณีการใช้งานที่นี่เป็นเรื่องปกติ ตัวอย่างเช่นหนึ่งในที่ผู้ใช้ปลายทางของ zipfile จะไม่เป็นผู้ใช้ แต่เป็นเซิร์ฟเวอร์
Michael Trouw

3

คุณทำไม่ได้

แต่สิ่งที่คุณทำได้คือลบโฟลเดอร์ที่ไม่ต้องการหลังจากซิป บรรทัดคำสั่งzipใช้อาร์กิวเมนต์ที่แตกต่างกันโดยที่หนึ่ง-dคือสำหรับการลบเนื้อหาตาม regex ดังนั้นคุณสามารถใช้สิ่งนี้:

zip -d filename.zip __MACOSX/\*

2

อย่าซิปไฟล์ที่ซ่อนอยู่:

zip newzipname filename.any  -x "\.*"

ด้วยคำถามนี้มันควรจะเป็นเช่น:

zip newzipname filename.any  -x "\__MACOSX"

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

zip newzipname filename.any

__MACOSXไม่ได้เริ่มต้นด้วย.
PJMeisch

ใช่ฉันทำผิดพลาด มันได้รับการแก้ไข ขอบคุณที่เตือนฉัน
Xian Shu

1

คุณหมายถึงzipเครื่องมือบรรทัดคำสั่งหรือคำสั่งการบีบอัดของ Finder's หรือไม่

สำหรับzipคุณสามารถลองใช้--data-forkตัวเลือก หากวิธีนี้ไม่ได้ผลคุณอาจลองใช้--no-extraแม้ว่าข้อมูลเมตาของไฟล์อื่น ๆ นั้นอาจมีค่าเช่น uid / gid และเวลาไฟล์

สำหรับคำสั่งบีบอัดของ Finder's ฉันไม่เชื่อว่ามีตัวเลือกใด ๆ ที่จะควบคุมพฤติกรรมของมัน สำหรับกรณีที่ง่าย

เครื่องมืออื่น ๆ และอาจจะเป็นหนึ่งว่า Finder dittoใช้จริงภายใต้ประทุนเป็น ด้วย-c -kตัวเลือกมันจะสร้างคลังไปรษณีย์ ด้วยเครื่องมือนี้คุณสามารถทดลองกับ--norsrc, --noextattr, --noqtn, --noaclและ / หรือเพียงแค่ปล่อยออกจาก--sequesterRsrcตัวเลือก (ซึ่งเป็นไปตามหน้าคนอาจจะเป็นผู้รับผิดชอบในการ__MACOSXไดเรกทอรีย่อย) แม้ว่าบางทีการขาดงาน--sequesterRsrcก็หมายถึงการใช้รูปแบบ AppleDouble ซึ่งจะสร้างไฟล์. _ ทั่วสถานที่แทนที่จะเป็นหนึ่ง__MACOSXไดเรกทอรี


1
ใช่ฉันหมายถึงยูทิลิตี้ "บีบอัด" ของผู้ค้นหา ตามที่เป็นอยู่ฉันได้รับโฟลเดอร์ที่เต็มไปด้วยไฟล์. _ ซึ่งไขลักษณะ / ตัวแก้ไขของ WordPress
Scott B

1

ฉันมีทางออกที่ดีกว่าหลังจากอ่านคำตอบที่มีอยู่ทั้งหมด ทุกสิ่งสามารถทำได้โดยเวิร์กโฟลว์ในคลิกขวาเดียว ไม่ต้องใช้ซอฟต์แวร์เพิ่มเติม, ไม่ต้องใช้คำสั่งที่ซับซ้อนและไม่มีเทคนิคการเชลล์

กระบวนการทำงานอัตโนมัติ:

  • อินพุต: ไฟล์หรือโฟลเดอร์จากแอปพลิเคชันใด ๆ
  • ขั้นตอนที่ 1: สร้างที่เก็บถาวรระบบสร้างขึ้นด้วยพารามิเตอร์เริ่มต้น
  • ขั้นตอนที่ 2: เรียกใช้คำสั่ง Shell โดยป้อนค่าเป็นพารามิเตอร์ คัดลอกคำสั่งด้านล่าง

    zip -d "$@" "__MACOSX/*" || true

    zip -d "$@" "*/.DS_Store" || true

บันทึกและเราเสร็จแล้ว! เพียงคลิกขวาที่โฟลเดอร์หรือไฟล์จำนวนมากแล้วเลือกเวิร์กโฟลว์จากเมนูบริการ ที่เก็บถาวรที่ไม่มีข้อมูลเมตาจะถูกสร้างขึ้นข้างๆ

ตัวอย่าง


0

นี่คือวิธีที่ฉันหลีกเลี่ยง__MACOSXไดเรกทอรีเมื่อบีบอัดไฟล์ด้วยtarคำสั่ง:

$ cd dir-you-want-to-archive $ find . | xargs xattr -l # <- list all files with special xattr attributes ... ./conf/clamav: com.apple.quarantine: 0083;5a9018b1;Safari;9DCAFF33-C7F5-4848-9A87-5E061E5E2D55 ./conf/global: com.apple.quarantine: 0083;5a9018b1;Safari;9DCAFF33-C7F5-4848-9A87-5E061E5E2D55 ./conf/web_server: com.apple.quarantine: 0083;5a9018b1;Safari;9DCAFF33-C7F5-4848-9A87-5E061E5E2D55

ลบแอตทริบิวต์ก่อน:

find . | xargs xattr -d com.apple.quarantine

เรียกใช้find . | xargs xattr -lอีกครั้งตรวจสอบให้แน่ใจว่าไม่มีไฟล์ใดมีแอตทริบิวต์ xattr ถ้างั้นคุณก็ไปได้ดี:

tar cjvf file.tar.bz2 dir

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