Mac nén nén mà không có thư mục __MACOSX?


158

Khi tôi nén các tệp với trình nén zip tích hợp trong Mac OSX, nó sẽ dẫn đến một thư mục bổ sung có tiêu đề "__MACOSX" được tạo trong zip được giải nén.

Tôi có thể điều chỉnh cài đặt của mình để giữ cho thư mục này không bị tạo hoặc tôi cần mua công cụ nén của bên thứ ba?

CẬP NHẬT : Tôi vừa tìm thấy một ứng dụng phần mềm miễn phí cho OSX giải quyết vấn đề của mình: " YemuZip "

CẬP NHẬT 2 : YemuZip không còn là phần mềm miễn phí


Sự tồn tại của thư mục _MACOSX không tạo ra bất kỳ vấn đề nào. Đơn giản chỉ cần xóa nó.
Jayprakash Dubey

1
Câu hỏi này dường như lạc đề vì nó phải có trong AskDifferent
Nakilon

11
Nó tạo ra một vấn đề với các dịch vụ web cầu kỳ đòi hỏi một kho lưu trữ zip nguyên sơ, vì vậy tôi rất biết ơn về những lời giải thích
mccc

21
@JayprakashDubey Đó là incredibily khó chịu, và như một người dùng Linux người thích không rời khỏi thùng rác ở khắp mọi nơi tôi đi, tôi không thể đứng __MACOSX, .DS_Store, ._fileName, và tất cả các loại turds khác Mac OS giảm trong kho lưu trữ của nó. OSX '`tar' cũng làm điều này - trong sự coi thường trắng trợn về nguyên tắc ít gây ngạc nhiên nhất .
Wyatt8740

Câu trả lời:


80

Khi tôi gặp vấn đề này, tôi đã thực hiện nó từ dòng lệnh:

zip file.zip uncompressed

EDIT , sau nhiều lần tải xuống: Tôi đã sử dụng tùy chọn này một thời gian trước đây và tôi không biết tôi đã học nó ở đâu, vì vậy tôi không thể cho bạn một lời giải thích tốt hơn. Câu trả lời của Chris Johnson là đúng, nhưng tôi sẽ không xóa của tôi. Như một bình luận nói, nó chính xác hơn với những gì OP đang hỏi, vì nó nén mà không có các tệp đó, thay vì xóa chúng khỏi tệp nén. Tôi thấy nó cũng dễ nhớ hơn.


33
Điều này thiếu giải thích.
Raptor

2
__MACOSX / thư mục con chứa các tài nguyên Mac và được tạo khi bạn sử dụng các công cụ Mac để tạo tệp zip. Tương tự, các công cụ Mac sẽ sử dụng __MACOSX / thư mục con để đặt các nhánh tài nguyên và thậm chí bạn sẽ không bao giờ nhìn thấy nó. Tuy nhiên, nếu bạn sử dụng các công cụ Mac để tạo tệp zip và một số công cụ khác để giải nén nó, bạn sẽ nhận được thư mục __MACOSX / chứ không phải các tài nguyên. Nếu bạn tạo tệp với zip, đó là ứng dụng của bên thứ 3, thì thư mục __MACOSX / không bao giờ được tạo ở vị trí đầu tiên.
Edward Falk

Xem câu trả lời của tôi để biết cách dễ dàng xóa thư mục _MACOSX sau khi tệp zip được tạo.
Chris Johnson

3
Để nén một thư mục đệ quy mà không cần __MACOSX và khác:zip -rX file.zip uncompressed_directory
Konstantin Suvorov

319

Có thể được sửa chữa sau khi thực tế bởi zip -d filename.zip __MACOSX/\*


51
để xóa các tệp .DS_Store:zip -d filename.zip \*/.DS_Store
Benedikt Köppel

5
Câu trả lời được chấp nhận cho biết làm thế nào để không nhận được thư mục __MACOSX / ở vị trí đầu tiên, nhưng không nói gì về việc phải làm gì với tệp .zip hiện có. Câu trả lời này cho biết làm thế nào để thoát khỏi __MACOSX / nếu bạn đã có nó. Tuy nhiên, câu hỏi ban đầu là làm thế nào để không có được nó ngay từ đầu, vì vậy câu trả lời được chấp nhận là câu trả lời đúng.
Edward Falk

Làm thế nào tôi có thể làm điều này đệ quy cho tất cả các tệp zip?
Wowfunhappy

Để áp dụng cho tất cả các tệp zip dưới một số root : find ~ -type f -name '*.zip' -exec zip -d '{}' __MACOSX/\* \;. Thay thế điểm bắt đầu của bạn cho ~.
Chris Johnson

Một chức năng để loại bỏ tất cả các tập tin rác : cleanzip(){ zip -d $1 $2 __MACOSX/\* \*/.DS_Store; }. Cách sử dụng: cleanzip file.ziphoặc cleanzip file.zip MORE_JUNK_FILES(tham số thứ hai là tùy chọn)
mrdaliri

56

Trong thư mục bạn muốn được nén, trong terminal:

zip -r -X Archive.zip *

Trong đó -X có nghĩa là: Loại trừ các tệp tài nguyên Mac vô hình đó như là _MACOSX, hoặc hoặc.

nguồn

Lưu ý: Sẽ chỉ hoạt động cho thư mục và cây thư mục tiếp theo bạn đang ở và phải có *ký tự đại diện.


9
Điều này không hoạt động như bạn nghĩ: -Xkhông loại trừ các tệp .DS_Store. Lý do nó có thể hoạt động cho ứng dụng của bạn là vì bạn chỉ nén *, đây là một tệp phù hợp với ký tự đại diện không bắt đầu bằng ".". Hãy thử nó trên một thư mục chứa tệp chấm và bạn sẽ thấy nó được bao gồm.
spinup

Xem câu trả lời của tôi để biết cách dễ dàng xóa thư mục _MACOSX sau khi tệp zip được tạo.
Chris Johnson

1
Không. Thực hiện zip -r -X Archive.zip myfoldertrên một thư mục vẫn dẫn đến một tệp zip chứa tệp .DS_Store.
Rockallite 11/03/2016

@Rockallite: bạn đúng, điều này sẽ chỉ hoạt động khi bạn nén các thư mục, cây hoặc tệp trong thư mục bạn đang ở. Do đó, bạn không thể chuyển thư mục làm đối số hoặc nó sẽ không hoạt động như mong đợi, chỉ với * ký tự đại diện sẽ nó hoạt động
pompalini

Điều này hoạt động cho các tập tin trong các thư mục, thay vì nén một thư mục hoàn chỉnh.
Michael Trouw

26

Lệnh này đã làm điều đó cho tôi:

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

Target.ziplà tệp zip cần tạo. Sourcelà tập tin / thư mục nguồn để nén. Và _xtham số chỉ định tệp / thư mục không bao gồm. Nếu cách trên không hoạt động vì bất kỳ lý do gì, hãy thử điều này thay vào đó:

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

OP đã hỏi cách loại trừ thư mục __MACOSX. Đoạn mã đầu tiên của bạn rõ ràng không hoạt động, bởi vì nó không đặt tên đó là một thư mục để loại trừ.
Chris Johnson

7
Các ziptiện ích dòng lệnh không bao giờ tạo ra một __MACOSXthư mục, do đó đoạn đầu tiên làm việc, và -x "__MACOSX"một phần là không cần thiết.
nisetama

15

Tôi đang sử dụng Automator Shell Script này để sửa nó sau. Nó hiển thị dưới dạng mục menu theo ngữ cảnh (nhấp chuột phải vào bất kỳ tệp nào hiển thị trong Finder).

while read -r p; do
  zip -d "$p" __MACOSX/\* || true
  zip -d "$p" \*/.DS_Store || true
done
  1. Tạo một dịch vụ mới với Automator
  2. Chọn "Tệp và thư mục" trong "Trình tìm kiếm"
  3. Thêm một "Hành động Shell Script"

kịch bản shell tự động

mục menu theo ngữ cảnh trong Finder


Sẽ tốt hơn nếu thực hiện nén bằng zip trong Automator Shell Script, thay vì nén bằng Apple tích hợp, sau đó xóa các tệp không mong muốn?
Matt

@Matt bạn có thể thêm bước lưu trữ trong trình tự động hóa hoặc sử dụng lệnh shell khác.
ttimasdf

@Matt cũng vậy, Apple tích hợp xử lý việc đặt tên tệp tự động và tăng tên khi tệp tồn tại. Với shell script, phần này sẽ có rất nhiều công việc.
ttimasdf

1
Nó sẽ báo lỗi nếu thư mục .DS_Store không có trong kho lưu trữ. Tôi đề nghị cải tiến bằng cách thêm `|| true` sau mỗi lệnh zip (chẳng hạn như zip -d "$p" __MACOSX/\* || truevào câu trả lời của bạn.
adamsf Family

1
Trong khi các câu trả lời khác là tốt, tôi thích câu trả lời này nhất vì nó có thể được sử dụng theo cách rất Macish.
not2savvy

10

Các thư mục không mong muốn cũng có thể bị xóa theo cách sau:

zip -d filename.zip "__MACOSX*"

Hoạt động tốt nhất cho tôi


8
zip -r "$destFileName.zip" "$srcFileName" -x "*/\__MACOSX" -x "*/\.*"
  • -x "*/\__MACOSX": bỏ qua __MACOSX như bạn đề cập.
  • -x "*/\.*": bỏ qua mọi tệp bị ẩn, chẳng hạn như .DS_Store.
  • Trích dẫn biến để tránh tập tin nếu nó được đặt tên bằng SPACE.

Ngoài ra, bạn có thể xây dựng Dịch vụ tự động để dễ dàng sử dụng trong Finder. Kiểm tra liên kết dưới đây để xem chi tiết nếu bạn cần.

Github


Heh, câu trả lời đúng duy nhất giữa một biển rác, cũng là câu có ít phiếu nhất. / thở dài
Heath Raftery

Nó hoạt động với tôi nhưng tôi đã phải xóa các trích dẫn xung quanh và ký hiệu đô la trước DestFileName.zip và srcFileName
Alexander Poleschuk

3

Các ziptiện ích dòng lệnh không bao giờ tạo ra một __MACOSXthư mục, vì vậy bạn chỉ có thể chạy một lệnh như thế này:

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

Trong đầu ra bên dưới, a.zipmà tôi đã tạo bằng ziptiện ích dòng lệnh không chứa __MACOSXthư mục, nhưng a 2.ziptôi đã tạo từ 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_Storekhông loại trừ .DS_Storecác tập tin trong thư mục nhưng -x \*.DS_Storekhông.

Tệp cấp cao nhất của kho lưu trữ zip có nhiều tệp thường phải là một thư mục, bởi vì nếu không, một số sử dụng không lưu trữ (như unzip7z, nhưng không phải là Tiện ích lưu trữ, Unarchiver unar, hoặc dtrx) không tạo thư mục chứa cho các tệp khi lưu trữ được trích xuất, điều này thường làm cho các tệp khó tìm và nếu nhiều tệp lưu trữ như vậy được trích xuất cùng một lúc, có thể khó biết được tệp nào thuộc về tệp lưu trữ nào.

Tiện ích lưu trữ chỉ tạo một __MACOSXthư mục khi bạn tạo một kho lưu trữ trong đó ít nhất một tệp chứa siêu dữ liệu như thuộc tính mở rộng, cờ tệp hoặc một ngã ba tài nguyên. Thư mục __MACOSXchứa các tệp AppleDouble có tên tệp bắt đầu bằng ._được sử dụng để lưu trữ siêu dữ liệu dành riêng cho OS X. Các ziptiện ích dòng lệnh vứt bỏ siêu dữ liệu như các thuộc tính mở rộng, cờ tập tin, và nĩa tài nguyên, trong đó cũng có nghĩa là siêu dữ liệu như thẻ bị mất, và rằng bí danh ngừng làm việc, bởi vì thông tin trong một tập tin bí danh được lưu trữ trong một ngã ba tài nguyên.

Thông thường bạn chỉ có thể loại bỏ siêu dữ liệu dành riêng cho OS X, nhưng để xem tệp siêu dữ liệu nào chứa, bạn có thể sử dụng xattr -l. xattrcũng bao gồm các nhánh tài nguyên và cờ tệp, bởi vì mặc dù chúng không thực sự được lưu trữ dưới dạng các thuộc tính mở rộng, chúng có thể được truy cập thông qua giao diện thuộc tính mở rộng. Cả Utility Utility và ziptiện ích dòng lệnh đều loại bỏ ACL.


Điều này chỉ hoạt động cho các thư mục, không phải cho một loạt các tập tin trong một thư mục.
Michael Trouw

@MichaelTrouw Có, nhưng bạn thường không nên tạo một kho lưu trữ chứa nhiều tệp ở cấp cao nhất ở vị trí đầu tiên.
nisetama

Tôi đồng ý không đồng ý vì có những trường hợp sử dụng trong đó điều này là tốt. Ví dụ: một trong đó người dùng cuối của zipfile sẽ không bao giờ là người dùng. Nhưng một máy chủ.
Michael Trouw

3

Bạn không thể.

Nhưng những gì bạn có thể làm là xóa những thư mục không mong muốn đó sau khi nén. Dòng lệnh ziplấy các đối số khác nhau trong đó một, là -d, để xóa nội dung dựa trên biểu thức chính quy. Vì vậy, bạn có thể sử dụng nó như thế này:

zip -d filename.zip __MACOSX/\*

2

không nén bất kỳ tập tin ẩn nào:

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

với câu hỏi này, nó sẽ giống như:

zip newzipname filename.any  -x "\__MACOSX"

Mặc dù vậy, phải nói rằng lệnh zip chạy trong terminal chỉ nén tệp, nó không nén bất kỳ cái nào khác. Vì vậy, làm điều này kết quả là như nhau:

zip newzipname filename.any

__MACOSXkhông bắt đầu với.
PJMeisch

vâng, tôi đã làm sai Nó đã được sửa đổi. Cảm ơn đã nhắc nhở tôi
Xian Shu

1

Ý bạn là zipcông cụ dòng lệnh hay lệnh Nén của Finder?

Đối với zip, bạn có thể thử --data-forktùy chọn. Nếu điều đó không làm được, bạn có thể thử --no-extra, mặc dù điều đó dường như bỏ qua siêu dữ liệu tệp khác có thể có giá trị, như uid / gid và thời gian tệp.

Đối với lệnh Nén của Trình tìm kiếm, tôi không tin có bất kỳ tùy chọn nào để kiểm soát hành vi của nó. Đó là cho trường hợp đơn giản.

Công cụ khác, và có thể là công cụ mà Finder thực sự sử dụng dưới mui xe, là ditto. Với các -c -ktùy chọn, nó tạo ra kho lưu trữ zip. Với công cụ này, bạn có thể thử nghiệm với --norsrc, --noextattr, --noqtn, --noaclvà / hoặc đơn giản là rời khỏi --sequesterRsrctùy chọn (trong đó, theo trang người đàn ông, có thể chịu trách nhiệm về __MACOSXthư mục con). Mặc dù, có lẽ sự vắng mặt của --sequesterRsrcphương tiện đơn giản là sử dụng định dạng AppleDouble, sẽ tạo các tệp ._ ở khắp mọi nơi thay vì một __MACOSXthư mục.


1
Có, tôi đang đề cập đến tiện ích "Nén" của trình tìm kiếm. Như vậy, tôi đang nhận được một thư mục chứa đầy các tệp ._ làm tăng sự xuất hiện / trình chỉnh sửa của WordPress
Scott B

1

Tôi có một giải pháp tốt hơn sau khi đọc tất cả các câu trả lời tồn tại. Mọi thứ có thể được thực hiện bởi một quy trình công việc chỉ bằng một cú nhấp chuột phải. KHÔNG có phần mềm bổ sung, KHÔNG có nội dung dòng lệnh phức tạp và KHÔNG có thủ thuật shell.

Quy trình công việc tự động hóa:

  • Đầu vào: tập tin hoặc thư mục từ bất kỳ ứng dụng.
  • Bước 1: Tạo Lưu trữ, hệ thống dựng sẵn với các tham số mặc định.
  • Bước 2: Chạy lệnh Shell, với đầu vào là tham số. Sao chép lệnh dưới đây.

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

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

Lưu nó và chúng tôi đã hoàn tất! Chỉ cần nhấp chuột phải vào thư mục hoặc hàng loạt tệp và chọn luồng công việc từ menu dịch vụ. Lưu trữ không có siêu dữ liệu sẽ được tạo cùng với.

Mẫu vật


0

Đây là cách tôi tránh __MACOSXthư mục khi nén các tệp bằng tarlệnh:

$ 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

Xóa thuộc tính trước:

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

Chạy find . | xargs xattr -llại, đảm bảo không có tệp nào có thuộc tính xattr. sau đó bạn tốt để đi:

tar cjvf file.tar.bz2 dir

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.