Dateien in OSX komprimieren, symbolische Links „auflösen“ wollen

Dateien in OSX komprimieren, symbolische Links „auflösen“ wollen

Ich habe eine Reihe von Verzeichnissen, sie sind alle Demos von Webskripten, die ich erstellt habe. Wichtig ist, dass sie alle Ressourcen gemeinsam nutzen. Daher habe ich ein globales Ressourcenverzeichnis erstellt und dieses Verzeichnis symbolisch mit jedem der Demoordner verknüpft.

Ich möchte jedes Demoverzeichnis in eine .zipDatei komprimieren. Dabei besteht mein Problem darin, dass die symbolischen Links in der ZIP-Datei erhalten bleiben und das Ressourcenverzeichnis auf einem anderen Computer einfach nicht vorhanden wäre.

Gibt es eine Möglichkeit, einen Demo-Ordner zu komprimieren und dabei alle symbolischen Links aufzulösen, sodass die Dateien beim Entpacken so aussehen, als wären sie Teil der Standarddateistruktur?

Vielen Dank :-)

Antwort1

Ein paar Fragen: 1) Verwendet die Ordnerstruktur, die Sie archivieren, intern symbolische Links, um Platz zu sparen? (Mit „intern“ meine ich, verweisen die symbolischen Links in einem bestimmten Stammordner nur auf andere Dateien oder Verzeichnisse, die sich ebenfalls in diesem Ordner befinden?).

2) Wie erstellen Sie das ZIP-Archiv in OS X? (Mit einem Befehlszeilentool, und wenn ja, mit welchem, oder mit dem Archivierungsprogramm usw.)

3) Welches Betriebssystem läuft auf dem Zielcomputer (auf dem das Archiv entpackt wird) und welche Methode verwenden Sie, um die Datei dort zu entpacken?

Zunächst einmal sind symbolische Links in OS X im Grunde reine Textdateien mit einigen zusätzlichen „Mac“-Informationen, die OS X mitteilen, dass es die Datei als symbolischen Link behandeln soll. Diese zusätzlichen Mac-Informationen sind ein spezieller Dateityp, ein Erstellercode und Finder-Flag-Informationen, die nicht in der Datei selbst, sondern im HFS+-Festplattenverzeichnis gespeichert sind.

Wenn Sie unter OS X eine ZIP-Datei erstellen, ist im ZIP-Stream kein Platz für diese zusätzlichen Mac-Informationen, sodass der symbolische Link gewissermaßen als einfache Datei in der ZIP-Datei gespeichert wird. Ob jemand auf einem anderen Mac das Archiv entpacken und die ursprüngliche Struktur korrekt darstellen kann, scheint davon abzuhängen, wen oder was Sie zum Entpacken verwenden.

Vor etwa einem Monat veröffentlichte beispielsweise ein Unternehmen ein Spiel über Steam, Valves Spielevertriebssoftware. Das Spielanwendungspaket enthielt NVIDIAs Cg-Bibliothek in Form eines Frameworks, das intern symbolische Links verwendet. Ursprünglich gab es ein Problem damit, dass Steam die erforderlichen Mac-Informationen auf Trine.app nicht richtig wiederherstellte, wie in diesem Thread erwähnt: http://forums.steampowered.com/forums/showthread.php?t=1556083

Das Bild unten zeigt zwei verschiedene Kopien des Cg.framework, eine hatte ich separat von der NVIDIA-Website installiert (oberes Bild) und das untere Bild zeigt, was mit dem Spiel geliefert wurde:

Alt-Text

Beachten Sie, dass alle Elemente übereinstimmen, es sich bei den symbolischen Links jedoch um einfache Datendateien handelt.

Nachdem ich mir den FSCatalogInfo-Datensatz für beide Artikel genauer angesehen hatte, war mir klar, wo das Problem lag:

Alt-Text

Sie werden im oberen Bild bemerken, dass der Anfang der FinderInfo-Struktur die folgenden Werte hat:

0x736C6E6B = 'slnk'
0x72686170 = 'rhap'

Diese Werte sind in /usr/include/hfs/hfs_format.h definiert:

/*
 *  File type and creator for symbolic links
*/
enum {
    kSymLinkFileType  = 0x736C6E6B, /* 'slnk' */
    kSymLinkCreator   = 0x72686170  /* 'rhap' */
};

Der 9. Bytewert, 0x80, entspricht dem kIsAliasFlag von finderInfo.finderFlags. Dieser Wert ist in /System/Library/Frameworks/CoreServices.framework/.../CarbonCore.framework/.../Headers/Finder.h definiert:

enum {
    kIsAlias                      = 0x8000 /* Files only */
};

Es scheint, dass die in OS X integrierte Entpackfunktion (Archivierungsdienstprogramm) fest codiert ist, um im zu entpackenden Archiv nach möglichen Dateien zu suchen, die symbolische Links darstellen, und die Informationen entsprechend festzulegen. Ich glaube, dass dies /usr/bin/ditto(wenn es für die Möglichkeit zum Archivieren von Dateien verwendet wird) auch für Sie erledigt wird. Ich bin mir nicht sicher, ob zipoder unzipob es das tut.

Antwort2

Dies ist das Standardverhalten für Info-ZIPs zip. Sie müssen -yoder übergeben --symlinks, um stattdessen symbolische Links im Archiv zu speichern.

Antwort3

Die Zip-Hilfe lautet:

-y symbolische Links als Link speichern statt der referenzierten Datei

verwandte Informationen