一部のシンボリックリンクを保持し、他のシンボリックリンクを保持せずにアーカイブを圧縮するにはどうすればよいですか? (OS X)

一部のシンボリックリンクを保持し、他のシンボリックリンクを保持せずにアーカイブを圧縮するにはどうすればよいですか? (OS X)

OS X の zip コマンドライン ツールを使用して、Xcode プロジェクト フォルダーを圧縮しています。

xx.framework/Versions/Currentそのフォルダには、 を指すようなシンボリックリンクを含む OS X 用の .framework が含まれていますxx.framework/Versions/A。プロジェクトを zip ファイルに圧縮してから解凍すると、Versions/A と Versions/Current の両方に同じファイル セットが含まれます。基本的に、アーカイブに 2 回含まれることになります。これを避ける必要があります。

ただし、プロジェクト フォルダーには、zip アーカイブにコピーする必要があるリソース ファイルを指すシンボリック リンクもあります。そのため、指し示すファイル/ディレクトリではなく、シンボリック リンクを格納するためにグローバル zip フラグを使用することはできません。

特定のシンボリックリンクのみが保存され、他のシンボリックリンクはそれらが指すコンテンツを保存する単一の ZIP ファイルを作成するにはどうすればよいですか?

zip でそんなことは可能なのでしょうか? 他に zip と互換性のあるツールはありますか? zip コマンドを複数回実行し、特定のファイルを除外/含めながら、ファイルを同じアーカイブに保存して、目的を達成できますか?

PS: zip の中に zip を入れることはできません。プロジェクトは解凍すると使用可能になり、含まれている zip を解凍する必要がなくなります。


私が試したこと:

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

アイデアとしては、まず .framework を zip 圧縮して、シンボリック リンクを保持するというものでした。次に、アーカイブを更新して、アーカイブにまだ含まれていない (少なくとも私はそう願っていました) シンボリック リンクが指すファイル/フォルダーを含む残りのファイルを追加します。結果: 破損したアーカイブ (エラー 20 - ディレクトリではありません)。

また、最初のパスでフレームワークを除外し、その後フレームワークを使用してアーカイブを更新するという逆のことも試しました。

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

結果: アーカイブが破損しています (エラー 21 - ディレクトリです)。

答え1

わかったよ!

1 つの問題は、間違った除外形式を使用したことです。先頭と末尾にアスタリスクを付けると、次の解決策が機能します。

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

そのため、最初にフレームワークを除いたフォルダーを zip ファイルに圧縮し、すべてのシンボリックリンクされたファイル/フォルダーをアーカイブにコピーします。

2 行目は、フラグy(ポイントされたファイル/フォルダーではなく、シンボリックリンクを保存する) を使用してアーカイブを更新します。フレームワーク フォルダーのみを明示的に含めます。これは必須ではないかもしれませんが、よりクリーンで高速になると思います。

関連情報