Mac zip сжимает без папки __MACOSX?

158

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

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

ОБНОВЛЕНИЕ : я только что нашел бесплатное приложение для OSX, которое решает мою проблему: " YemuZip "

UPDATE 2 : YemuZip больше не бесплатная

Скотт Б
источник
Наличие папки _MACOSX не создает никаких проблем. Просто удалите это.
Джайпракаш Дубей
1
Этот вопрос кажется не по теме, потому что он должен быть в AskDifferent
Nakilon
11
Это создает проблему с придирчивыми веб-сервисами, которые требуют нетронутого zip-архива, поэтому я благодарен за объяснения
mccc
21
@JayprakashDubey Это incredibily раздражает, и как пользователь Linux , который любит не оставляя мусор везде , куда я иду, я не могу стоять __MACOSX, .DS_Store, ._fileName, и все другие различные экскременты Mac OS падает в своих архивах. «OS» tar OSX делает то же самое - вопиющее игнорирование принципа наименьшего удивления .
Wyatt8740

Ответы:

80

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

zip file.zip uncompressed

РЕДАКТИРОВАТЬ , после многих отрицательных голосов: я использовал эту опцию некоторое время назад, и я не знаю, где я узнал, поэтому я не могу дать вам лучшее объяснение. Ответ Криса Джонсона правильный, но я не буду удалять свой. Как говорится в одном комментарии, он более точен в отношении того, что запрашивает OP, поскольку он сжимает без этих файлов, а не удаляет их из сжатого файла. Мне тоже легче запомнить.

sinuhepop
источник
33
Этому не хватает объяснения.
Raptor
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
также удалить .DS_Store файлы:zip -d filename.zip \*/.DS_Store
Benedikt Köppel
5
Принятый ответ говорит о том, как не получить каталог __MACOSX /, но ничего не говорит о том, что делать с существующим ZIP-файлом. Этот ответ говорит о том, как избавиться от __MACOSX /, если он у вас уже есть. Однако первоначальный вопрос заключался в том, как не получить его в первую очередь, поэтому принятый ответ является правильным.
Эдвард Фальк
Как я могу сделать это рекурсивно для всех ZIP-файлов?
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
57

Внутри папки, которую вы хотите сжать, в терминале:

zip -r -X Archive.zip *

Где -X означает: исключить эти невидимые файлы ресурсов Mac, такие как «_MACOSX» или «._Filename» и файлы .ds store

источник

Примечание. Будет работать только для той папки и последующего дерева папок, в которых вы находитесь, и должен иметь *подстановочный знак.

pompalini
источник
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это почтовый файл для создания. Sourceисходный файл / папка для архивирования И _xпараметр указывает файл / папку, чтобы не включать. Если вышеупомянутое не работает по любой причине, попробуйте это вместо этого:

zip -r Target.zip Source -x "*.DS_Store" -x "__MACOSX"
Адиль Хуссейн
источник
ОП спросил, как исключить папку __MACOSX. Ваш первый фрагмент кода, очевидно, не работает, потому что он не называет это как исключаемую папку.
Крис Джонсон
7
zipУтилита командной строки никогда не создает __MACOSXкаталог, поэтому первый фрагмент делает работу, а -x "__MACOSX"часть не нужна.
nisetama
15

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

while read -r p; do
  zip -d "$p" __MACOSX/\* || true
  zip -d "$p" \*/.DS_Store || true
done
  1. Создать новый сервис с Automator
  2. Выберите «Файлы и папки» в «Finder»
  3. Добавить «Shell Script Action»

сценарий оболочки automator

пункт контекстного меню в Finder

Бенедикт
источник
Не лучше ли выполнить сжатие с помощью zip в сценарии оболочки Automator, а не сжимать с помощью встроенного Apple, а затем удалить ненужные файлы?
Мэтт
@Matt вы можете добавить шаг архивирования в automator или использовать другую команду оболочки.
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.
  • Кавычки переменная, чтобы избежать файла, если он назван с пробелом.

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

Github

Цзянь Джейсон
источник
Хех, единственный правильный ответ среди моря мусора, также тот, который набрал наименьшее количество голосов. / вздох
Хит
Это сработало для меня, но мне пришлось убрать кавычки и символ доллара перед 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-архива с несколькими файлами обычно должен быть одним каталогом, потому что если это не так, некоторые утилиты для разархивирования (например, unzip7z утилиты для и , но не утилита архивирования, Unarchiver unar, илиdtrx ) не создают каталог, содержащий для файлы при извлечении архива, что часто затрудняет поиск файлов, и если несколько подобных архивов извлекаются одновременно, может быть трудно определить, какие файлы принадлежат какому архиву.

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

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

nisetama
источник
Это работает только для каталогов, а не для группы файлов внутри каталога.
Майкл Троу
@MichaelTrouw Да, но обычно вы не должны создавать архив, который в первую очередь содержит несколько файлов на верхнем уровне.
nisetama
Я согласен не соглашаться, потому что есть случаи, когда это нормально. Например, тот, в котором конечный пользователь zip-файла никогда не будет пользователем. Но сервер.
Майкл Троу,
3

Ты не можешь

Но вы можете удалить ненужные папки после архивирования. Командная строка zipпринимает разные аргументы, где один -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
да, я ошибся Это было изменено. Спасибо за напоминание
Сиань Шу
1

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

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

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

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

Кен Томасес
источник
1
Да, я имею в виду утилиту поиска "Compress". На самом деле я получаю папку, полную ._ файлов, которые портят внешний вид / редактор WordPress
Скотт Б
1

У меня есть лучшее решение после прочтения всех существующих ответов. Все может быть сделано с помощью рабочего процесса в один клик правой кнопкой мыши. НИКАКОГО дополнительного программного обеспечения, НИКАКИХ сложных вещей командной строки и НИКАКИХ уловок оболочки.

Рабочий процесс автоматизатора:

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

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

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

Сохраните это, и мы сделали! Просто щелкните правой кнопкой мыши папку или большую часть файлов и выберите рабочий процесс из меню служб. Архив без метаданных будет создан рядом.

Образец

ttimasdf
источник
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

Чжан Хуанбинь
источник