Как заархивировать, сохранив некоторые символические ссылки, но не все? (OS X)

Как заархивировать, сохранив некоторые символические ссылки, но не все? (OS X)

Я использую инструмент командной строки zip в OS X для сжатия папки проекта Xcode.

В эту папку включен .framework для OS X, который включает символические ссылки, например, xx.framework/Versions/Currentwhich указывает на xx.framework/Versions/A. Когда я архивирую проект, а затем распаковываю его, Versions/A и Versions/Current содержат один и тот же набор файлов — по сути, они содержатся в архиве дважды — мне нужно этого избежать.

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

Как создать один ZIP-файл, в котором будут храниться только определенные символические ссылки, а в других будет храниться содержимое, на которое они указывают?

Возможно ли это вообще с zip? Есть ли другой совместимый с zip инструмент, который я мог бы использовать? Могу ли я запустить команду zip несколько раз, исключая/включая определенные файлы, сохраняя файлы в тот же архив, чтобы добиться того, чего я хочу?

PS: Я не могу иметь zip внутри zip. После распаковки проект должен быть пригоден для использования и не требовать распаковки содержащегося zip.


Что я пробовал:

zip -rq4y $ZIPFILE $TARGETFOLDER/xx.framework
zip -rq4u $ZIPFILE $TARGETFOLDER

Идея была в том, чтобы сначала заархивировать .framework, сохранив символические ссылки. Затем обновить архив, чтобы добавить остальные файлы, включая любые файлы/папки, на которые указывают символические ссылки, которых еще нет в архиве (или я на это надеялся). Результат: поврежденный архив (Ошибка 20 — Не каталог).

Я также попробовал сделать наоборот, исключив фреймворк при первом проходе, а затем обновив архив с фреймворком:

zip -rq4 $ZIPFILE $TARGETFOLDER -x xx.framework
zip -rq4uy $ZIPFILE $TARGETFOLDER

Результат: поврежденный архив (Ошибка 21 — Является каталогом).

решение1

Попался!

Одна из проблем заключалась в том, что я использовал неправильный формат исключения. С начальной и конечной звездочками это решение работает:

zip -rq4 $ZIPFILE $TARGETFOLDER -x *xx.framework*
zip -rq4uy $ZIPFILE $TARGETFOLDER -i *xx.framework*

Поэтому сначала он архивирует папку, за исключением фреймворка, копируя все связанные файлы/папки в архив.

Вторая строка обновляет архив с yфлагом (хранить символические ссылки, а не файлы/папки, на которые они указывают). Я явно включаю только папку фреймворка, это может быть не обязательно, но я думаю, что это чище и, возможно, быстрее.

Связанный контент