Сжатие Mac zip без папки MACOSX?

когда я сжимаю файлы со встроенным zip-компрессором в Mac OSX, это приводит к дополнительной папке под названием "__MACOSX", созданной в извлеченном zip.

могу ли я настроить параметры, чтобы эта папка не создавалась, или мне нужно купить сторонний инструмент сжатия?

обновление: Я только что нашел бесплатное приложение для OSX, которое решает мою проблему:"YemuZip"

обновление 2: YemuZip больше не является бесплатным

13 ответов


когда у меня была эта проблема, я сделал это из командной строки:

zip file.zip uncompressed

редактировать, после многих downvotes: я использовал этот вариант некоторое время назад, и я не знаю, где я его узнал, поэтому я не могу дать вам лучшее объяснение. Крис Джонсон ответ правильно, но я не буду удалять мой. Как говорится в одном комментарии, это более точно, что OP спрашивает, поскольку он сжимает без этих файлов, а не удаляет их из сжатого файла. Я найти его проще тоже помню.


может быть исправлено после факта zip -d filename.zip __MACOSX/\*


Ok после того, как я остановился на этом, я нашел это решение, из терминала:

zip -r -X Archive.zip *

где-X означает: исключить эти невидимые файлы ресурсов Mac, такие как "_MACOSX" или "._Имя файла и. хранить файлы ДС

источник


эта команда сделала это для меня:

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

Target.zip - это zip-файл для создания. Source является исходным файлом / папкой для zip up. И _x параметр указывает файл / папку, которую не следует включать. Если вышеизложенное не работает по какой-либо причине, попробуйте вместо этого:

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

Я использую этот сценарий оболочки Automator, чтобы исправить его после. Он отображается как пункт контекстного меню (щелчок правой кнопкой мыши по любому файлу, отображаемому в Finder).

while read -r p; do
  zip -d "$p" __MACOSX/\* || true
  zip -d "$p" \*/.DS_Store || true
done
  1. создать новый сервис с Automator
  2. Выберите "файлы и папки"в " Finder"
  3. добавить "действие сценария оболочки"

automator shell script

contextual menu item in Finder


ненужные папки могут быть удалены следующим образом:

zip -d filename.zip "__MACOSX*"

работает лучше всего для меня


на zip утилиты командной строки никогда не создает __MACOSX каталог, поэтому вы можете просто запустить такую команду:

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

в выводе ниже,a.zip который я создал с zip утилиты командной строки не содержит , а 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 каталог при создании архива, в котором хотя бы один файл содержит метаданные, такие как расширенные атрибуты, флаги файлов или вилка ресурсов. The __MACOSX каталог содержит AppleDouble файлы, имя файла которых начинается с ._ которые используются для хранения специфичных для OS X метаданных. The zip утилита командной строки удаляет метаданные, такие как расширенные атрибуты, флаги файлов и вилки ресурсов, что также означает, что метаданные, такие как теги, теряются и что псевдонимы перестают работать, потому что информация в файле псевдонима хранится в вилке ресурсов.

обычно вы можете просто отбросить метаданные OS X, но чтобы увидеть, какие файлы метаданных содержат, вы можете использовать xattr -l. xattr также включает вилки ресурсов и флаги файлов, потому что, хотя они фактически не хранятся как расширенные атрибуты, к ним можно получить доступ через интерфейс расширенных атрибутов. Как утилита архивирования, так и zip утилита командной строки отбрасывает ACLs.


не zip любой скрытый файл:

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

С этим вопросом, это должно быть так:

zip newzipname filename.any  -x "\__MACOSX"

надо сказать, однако, команда zip запускается в терминале, просто сжимая файл, он не сжимает никаких других. Так что сделайте это результат тот же:

zip newzipname filename.any

вы имеете в виду zip инструмент командной строки или команда сжатия Finder?

на zip, вы можете попробовать . Если это не делает этого, вы можете попробовать --no-extra, хотя это, похоже, игнорирует другие метаданные файла, которые могут быть ценными, например uid/gid и file times.

для команды сжатия Finder я не считаю, что есть какие-либо варианты для управления ее поведением. Это для простого дела.

другой инструмент, и, возможно, тот, который Finder фактически использует под капотом, является ditto. С -c -k параметры, он создает zip-архивы. С помощью этого инструмента вы можете экспериментировать с --norsrc, --noextattr, --noqtn, --noacl и/или просто убрать --sequesterRsrc вариант (который, согласно странице руководства, может нести ответственность за __MACOSX поддиректорию). Хотя, возможно, отсутствие --sequesterRsrc просто означает использовать формат AppleDouble, который будет создавать ._ файлы повсюду вместо одного __MACOSX справочник.


ты не можешь.

но то, что вы можете сделать, это удалить эти нежелательные папки после молнии. Командная строка zip принимает разные аргументы, где один,-d, предназначен для удаления содержимого на основе регулярных выражений. Таким образом, вы можете использовать его следующим образом:

zip -d filename.zip __MACOSX/\*

у меня есть лучшее решение после прочтения всех существующих ответов. Все можно сделать с помощью рабочего процесса в один щелчок правой кнопкой мыши. нет дополнительное программное обеспечение,нет сложные материалы командной строки и нет shell трюки.

рабочий процесс automator:

  • Input: файлы или папки из любого приложения.
  • Шаг 1: Создайте архив, встроенную систему с параметрами по умолчанию.

вот как я избегаю __MACOSX каталог при сжатии файлов с помощью :

$ 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


zip -r "$destFileName.zip" "$srcFileName" -x "*/\__MACOSX" -x "*/\.*"
  • -x "*/\__MACOSX": игнорировать _ _ MACOSX, как вы упомянули.
  • -x "*/\.*": игнорировать любой скрытый файл, например .DS_Store .
  • укажите переменную, чтобы избежать файла, если она названа пробелом.

кроме того, вы можете построить службу Automator, чтобы сделать его легко использовать в Finder. Проверьте ссылку ниже, чтобы увидеть детали, если вам нужно.

Github