Mac zip компрес без папки __MACOSX?


158

Коли я стискаю файли із вбудованим компресором zip у Mac OSX, це призводить до отримання додаткової папки під назвою "__MACOSX", створеної у витягнутому блискавці.

Чи можу я налаштувати свої налаштування, щоб ця папка не створювалась чи мені потрібно придбати сторонній інструмент стиснення?

ОНОВЛЕННЯ . Щойно я знайшов безкоштовний додаток для OSX, який вирішує мою проблему: " YemuZip "

ОНОВЛЕННЯ 2 : YemuZip більше не безкоштовний


Існування папки _MACOSX не створює жодних проблем. Просто видаліть його.
Джайпракаш Дубей

1
Це питання видається поза темою, оскільки воно повинно бути в AskDifferent
Nakilon

11
Це створює проблеми з прискіпливими веб-сервісами, які потребують незайманого архіву zip, тому я вдячний за пояснення
mccc

21
@JayprakashDubey Це incredibily дратує, і як користувач Linux , який любить не полишаючи сміття скрізь , куди я йду, я не можу стояти __MACOSX, .DS_Store, ._fileName, і всі інші різні екскременти Mac OS падає в своїх архівах. Це також робить "tar" OSX - в кричущому зневаженні до принципу найменшого здивування .
Wyatt8740

Відповіді:


80

Коли у мене була ця проблема, я це зробив з командного рядка:

zip file.zip uncompressed

EDIT , після багатьох зворотних запитів: я користувався цим варіантом деякий час тому, і не знаю, де я це навчився, тому не можу дати вам кращого пояснення. Кріс Джонсон відповідь правильний, але я не буду видаляти мої. Як зазначається в одному коментарі, точніше те, що запитує ОП, оскільки він стискає без цих файлів, замість того, щоб видаляти їх із стислого файла. Мені теж легше запам’ятати.


33
Цьому бракує пояснень.
Раптор

2
Підкаталог __MACOSX / містить вилки ресурсів Mac і створюється при використанні інструментів Mac для створення zip-файлу. Так само інструменти Mac споживають підкаталог __MACOSX / для встановлення вилок ресурсів, і ви його навіть ніколи не побачите. Однак якщо ви використовуєте інструменти Mac для створення zip-файлу та деякі інші інструменти для його розпакування, ви отримаєте каталог __MACOSX /, а не вилки ресурсів. Якщо ви створюєте файл zip, який є стороннім додатком, то __MACOSX / каталог ніколи не створюється в першу чергу.
Едвард Фолк

Дивіться мою відповідь про простий спосіб видалення папки _MACOSX після створення zip-файлу.
Кріс Джонсон

3
Рекурсивно стискати каталог без __MACOSX та інших:zip -rX file.zip uncompressed_directory
Костянтин Суворов

319

Можна зафіксувати після факту за допомогою zip -d filename.zip __MACOSX/\*


51
також видалити файли zip -d filename.zip \*/.DS_Store
.DS_Store

5
Прийнята відповідь говорить про те, як не отримати в першу чергу каталог __MACOSX /, але нічого не говорить про те, що робити з існуючим файлом .zip. Ця відповідь говорить про те, як позбутися __MACOSX / якщо у вас вже є. Однак первісне питання полягало в тому, як не отримати його в першу чергу, тому прийнята відповідь є правильною.
Едвард Фолк

Як я можу зробити це рекурсивно для всіх поштових файлів?
Wowfunhappy

Щоб застосувати до всіх файлів поштового індексу під деяким коренем: find ~ -type f -name '*.zip' -exec zip -d '{}' __MACOSX/\* \;. Замініть свою початкову точку для ~.
Кріс Джонсон

Функція для видалення всіх непотрібних файлів: 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 файлів. Причина, з якою це може працювати для вашої програми, полягає в тому, що ви лише застібкуєте *, це файли відповідності підстановочних символів, які не починаються з ".". Спробуйте його в каталозі, що містить крапковий файл, і ви побачите, що він включається.
спінуп

Дивіться мою відповідь про простий спосіб видалення папки _MACOSX після створення zip-файлу.
Кріс Джонсон

1
Ні. Якщо zip -r -X Archive.zip myfolderпапка все ще призводить до отримання zip-файлу, що містить .DS_Store-файл.
Rockallite

@Rockallite: ви маєте рацію, це буде працювати лише тоді, коли ви поскакуєте папки, дерево або файли в папці, в якій ви перебуваєте. Отже, ви не можете передавати папку як аргумент, інакше вона не працюватиме, як очікувалося, лише з символом * це працює.
помпаліні

Це працює для файлів всередині каталогів, замість того, щоб застебнути повну папку.
Майкл Трув

26

Ця команда зробила це для мене:

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

Target.zipце zip-файл для створення. Sourceє вихідним файлом / папкою для завантаження. І _xпараметр вказує, що файл / папка не включати. Якщо вищезгадане не працює з будь-якої причини, спробуйте скористатися цим:

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

ОП запитала, як виключити папку __MACOSX. Ваш перший фрагмент коду, очевидно, не працює, тому що він не називає це папкою для виключення.
Кріс Джонсон

7
zipУтиліта командного рядка ніколи не створює __MACOSXкаталог, тому перший фрагмент робить роботу, а -x "__MACOSX"частина не потрібна.
нісетама

15

Я використовую цей скрипт оболонки автоматизатора, щоб виправити це після. Він відображається як пункт контекстного меню (клацання правою кнопкою миші на будь-який файл, що відображається в 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, а не стискати за допомогою вбудованого Apple, а потім видаляти непотрібні файли?
Метт

@Matt Ви можете додати крок архіву в автоматизаторі або також використовувати іншу команду оболонки.
ttimasdf

@Matt також вбудований Apple обробляє автоматичне іменування файлів та збільшення ім'я, коли файл існує. З сценарієм оболонки ця частина була б багато роботи.
ttimasdf

1
Він видає помилку, якщо папка .DS_Store відсутня в архіві. Я пропоную вдосконалення, додавши `|| true` після кожної команди zip (наприклад, zip -d "$p" __MACOSX/\* || trueу вашій відповіді.
adamsfamily

1
Хоча інші відповіді хороші, мені це найбільше подобається, оскільки його можна використовувати дуже макішським способом.
not2savvy

10

Небажані папки можна також видалити наступним чином:

zip -d filename.zip "__MACOSX*"

Для мене найкраще працює


8
zip -r "$destFileName.zip" "$srcFileName" -x "*/\__MACOSX" -x "*/\.*"
  • -x "*/\__MACOSX": ігноруйте __MACOSX, як ви згадували.
  • -x "*/\.*": ігноруйте будь-який прихований файл, наприклад .DS_Store.
  • Цитуйте змінну, щоб уникнути файлу, якщо він названий SPACE.

Крім того, ви можете створити службу автоматизації, щоб її було зручно використовувати у Finder. Перевірте посилання нижче, щоб переглянути деталі, якщо вам це потрібно.

Гітуб


Гей, єдина правильна відповідь серед моря сміття - це також та, яка має найменше голосів. / зітхання
Хіт

Це працювало для мене, але мені довелося прибрати котирування навколо символу долара перед destFileName.zip та srcFileName
Олександр Полещук

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 ), не створюють каталог, що містить файли, коли архів витягується, що часто ускладнює пошук файлів, і якщо кілька подібних архівів одночасно витягуються, може бути важко сказати, які файли належать до якого архіву.

Archive Utility створює __MACOSXкаталог лише тоді, коли ви створюєте архів, де принаймні один файл містить метадані, такі як розширені атрибути, прапорці файлів або вилка ресурсу. __MACOSXКаталог містить AppleDouble файлів, ім'я файлу починається з ._, які використовуються для зберігання OS X специфічних метаданих. В zipутиліті командного рядок відкидає метадані , такі як розширені атрибути, прапори файлів, вилок і ресурсів, що також означає , що метадані , такі як мітка втрачається, і що псевдоніми перестати працювати, тому що інформація у файлі псевдоніми зберігається в гілці ресурсів.

Зазвичай ви можете просто відкинути метадані, характерні для ОС X, але, щоб побачити, що містять файли метаданих, ви можете використовувати xattr -l. xattrтакож включає вилки ресурсів та прапори файлів, оскільки, хоча вони фактично не зберігаються як розширені атрибути, до них можна отримати доступ через розширений інтерфейс атрибутів. Як утиліта архіву, так і утиліта zipкомандного рядка відкидають ACL.


Це працює лише для каталогів, а не для кучки файлів всередині каталогу.
Майкл Трув

@MichaelTrouw Так, але зазвичай не слід створювати архів, який містить декілька файлів на найвищому рівні в першу чергу.
nisetama

Я погоджуюсь не погоджуватися, оскільки є випадки використання, коли це нормально. Наприклад, той, у якому кінцевим користувачем zipfile ніколи не буде користувач. Але сервер.
Майкл Трув

3

Ви не можете.

Але ви можете видалити ці небажані папки після блискавки. Командний рядок zipбере різні аргументи, де один, the -d, призначений для видалення вмісту на основі регулярного вираження. Тож ви можете використовувати його так:

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 Compress?

Бо zipможна спробувати --data-forkваріант. Якщо це не зробити, ви можете спробувати--no-extra , хоча це, здається, ігнорує інші метадані файлів, які можуть бути цінними, наприклад, uid / gid та час файлу.

Для команди Finder's Compress я не вірю, що існують варіанти контролю її поведінки. Це для простого випадку.

Інший інструмент, а може бути і той, який Finder насправді використовує під кришкою, - це ditto. За допомогою -c -kпараметрів це створює архіви zip. З допомогою цього інструменту ви можете експериментувати з --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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.