Wie kann ich ein Archiv komprimieren und dabei einige symbolische Links beibehalten, andere jedoch nicht? (OS X)

Wie kann ich ein Archiv komprimieren und dabei einige symbolische Links beibehalten, andere jedoch nicht? (OS X)

Ich verwende das Zip-Befehlszeilentool unter OS X, um einen Xcode-Projektordner zu komprimieren.

In diesem Ordner ist ein .framework für OS X enthalten, das symbolische Links wie „ xx.framework/Versions/Currentwhich points to“ enthält xx.framework/Versions/A. Wenn ich das Projekt komprimiere und dann entpacke, enthalten sowohl Versions/A als auch Versions/Current denselben Satz von Dateien – im Grunde sind sie zweimal im Archiv enthalten – das muss ich vermeiden.

Allerdings habe ich im Projektordner auch Symlinks, die auf Ressourcendateien verweisen, die in das Zip-Archiv kopiert werden müssen. Ich kann also nicht einfach die globalen Zip-Flags verwenden, um die Symlinks zu speichern, anstatt die Dateien/Verzeichnisse, auf die verwiesen wird.

Wie kann ich eine einzelne ZIP-Datei erstellen, in der nur bestimmte symbolische Links gespeichert werden, während in anderen nur der Inhalt gespeichert wird, auf den sie verweisen?

Ist das mit Zip überhaupt möglich? Gibt es ein anderes Zip-kompatibles Tool, das ich verwenden könnte? Könnte ich den Zip-Befehl mehrmals ausführen und dabei bestimmte Dateien ausschließen/einschließen, während ich die Dateien im selben Archiv speichere, um das zu erreichen, was ich möchte?

PS: Ich kann kein Zip in der Zip-Datei haben. Nach dem Entpacken muss das Projekt verwendbar sein und darf nicht das Entpacken einer enthaltenen Zip-Datei erfordern.


Dinge, die ich versucht habe:

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

Die Idee war, zuerst die .framework-Datei zu komprimieren und dabei die Symlinks beizubehalten. Dann das Archiv aktualisieren, um den Rest der Dateien hinzuzufügen, einschließlich aller Dateien/Ordner, auf die durch Symlinks verwiesen wird, die noch nicht im Archiv enthalten sind (das hoffte ich zumindest). Ergebnis: beschädigtes Archiv (Fehler 20 – Kein Verzeichnis).

Ich habe auch das Gegenteil versucht, also das Framework beim ersten Durchgang ausgeschlossen und dann das Archiv mit dem Framework aktualisiert:

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

Ergebnis: beschädigtes Archiv (Fehler 21 – Ist ein Verzeichnis).

Antwort1

Erwischt!

Ein Problem bestand darin, dass ich das falsche Ausschlussformat verwendet habe. Mit dem führenden und nachfolgenden Sternchen funktioniert diese Lösung:

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

Daher wird zunächst der Ordner (mit Ausnahme des Frameworks) komprimiert, wobei alle symbolisch verknüpften Dateien/Ordner in das Archiv kopiert werden.

Die zweite Zeile aktualisiert das Archiv mit dem yFlag (speichert symbolische Links statt der Dateien/Ordner, auf die verwiesen wird). Ich schließe ausdrücklich nur den Framework-Ordner ein. Das ist vielleicht nicht notwendig, aber ich denke, es ist sauberer und möglicherweise schneller.

verwandte Informationen