
У меня есть несколько каталогов, все они являются демонстрациями веб-скриптов, которые я создал, важный факт в том, что все они разделяют ресурсы. Поэтому я создал глобальный каталог ресурсов и символически связал этот каталог с каждой из демонстрационных папок.
Я хочу сжать каждый демонстрационный каталог в .zip
файл. Проблема в том, что символические ссылки сохраняются в zip-файле, а на другой машине каталог ресурсов просто не будет существовать.
Есть ли способ заархивировать демонстрационную папку, разрешив все символические ссылки, чтобы при распаковке файлы отображались так, как будто они являются частью стандартной файловой структуры?
Большое спасибо :-)
решение1
Пара вопросов: 1) Использует ли структура папок, которую вы архивируете, внутренние символические ссылки для экономии места? (Под «внутренними» я подразумеваю, что при наличии конкретной корневой папки символические ссылки внутри этой корневой папки ссылаются только на другие файлы или каталоги, которые также находятся в этой папке?).
2) Как вы создаете архив .zip в OS X? (Используя командную строку, и если да, то какую, или используя Archive Utility и т. д.)
3) Какая операционная система установлена на целевом компьютере (на котором будет распакован архив) и какой метод вы используете для распаковки файла?
Прежде всего, в OS X символические ссылки в основном представляют собой простые текстовые файлы с некоторой дополнительной информацией "Mac", которая позволяет OS X знать, что она должна рассматривать файл как символическую ссылку. Эта дополнительная информация Mac представляет собой специальный тип файла, код создателя и информацию о флаге Finder, которая хранится не в самом файле, а в каталоге диска HFS+.
В OS X, когда вы создаете .zip-файл, в zip-потоке нет места для этой дополнительной информации Mac, поэтому, в некотором смысле, символическая ссылка хранится в zip-файле как простой файл. Сможет ли кто-то на другом Mac распаковать архив и правильно ли он будет представлять исходную структуру, по-видимому, зависит от того, кого или что вы используете для его распаковки.
Например, около месяца назад компания выпустила игру через Steam, программное обеспечение Valve для распространения игр. Пакет игрового приложения включал библиотеку NVIDIA Cg в виде фреймворка, который внутри использует символические ссылки. Изначально была проблема со Steam, который не восстанавливал должным образом необходимую информацию Mac в Trine.app, как упоминалось в этой теме: http://forums.steampowered.com/forums/showthread.php?t=1556083
На изображении ниже показаны две разные копии Cg.framework, одну из которых я установил отдельно с сайта NVIDIA (верхнее изображение), а нижнее изображение показывает то, что было получено вместе с игрой:
Обратите внимание, что все элементы совпадают, но то, что должно быть символическими ссылками, на самом деле является простыми файлами данных.
После более внимательного изучения записи FSCatalogInfo для обоих элементов мне стало ясно, в чем проблема:
На верхнем изображении вы заметите, что начало структуры finderInfo имеет следующие значения:
0x736C6E6B = 'slnk'
0x72686170 = 'rhap'
Эти значения определены в /usr/include/hfs/hfs_format.h:
/*
* File type and creator for symbolic links
*/
enum {
kSymLinkFileType = 0x736C6E6B, /* 'slnk' */
kSymLinkCreator = 0x72686170 /* 'rhap' */
};
Значение 9-го байта, 0x80, соответствует kIsAlias
флагу finderInfo.finderFlags
. Это значение определено в /System/Library/Frameworks/CoreServices.framework/.../CarbonCore.framework/.../Headers/Finder.h:
enum {
kIsAlias = 0x8000 /* Files only */
};
Похоже, что встроенная в OS X функция unzip (Archive Utility) жестко запрограммирована на поиск возможных файлов в распаковываемом архиве, представляющих символические ссылки, и на установку соответствующей информации. Я считаю, что /usr/bin/ditto
(при использовании для возможности архивировать файлы) она также заботится об этом за вас. Я не уверен, делает ли это zip
или unzip
нет.
решение2
Это поведение по умолчанию для Info-ZIP zip
. Вам нужно передать -y
или , --symlinks
чтобы сохранить символические ссылки внутри архива.
решение3
Справка по ZIP-архиву гласит:
-y сохранять символические ссылки как ссылку, а не как файл, на который они ссылаются