Estoy usando la herramienta de línea de comando zip en OS X para comprimir una carpeta de proyecto Xcode.
En esa carpeta se incluye un .framework para OS X que incluye enlaces simbólicos como xx.framework/Versions/Current
los que apuntan a xx.framework/Versions/A
. Cuando comprimo el proyecto y luego lo descomprimo, tanto las Versiones/A como las Versiones/Actuales contienen el mismo conjunto de archivos; básicamente, están contenidos dos veces en el archivo; necesito evitar eso.
Sin embargo, también tengo enlaces simbólicos en la carpeta del proyecto que apuntan a archivos de recursos que deben copiarse en el archivo zip. Por lo tanto, no puedo simplemente usar los indicadores zip globales para almacenar los enlaces simbólicos en lugar de los archivos/directorios a los que apunta.
¿Cómo puedo crear un único archivo ZIP donde solo se almacenen ciertos enlaces simbólicos mientras que otros almacenarán el contenido al que apuntan?
¿Es eso posible incluso con zip? ¿Existe otra herramienta compatible con zip que pueda utilizar? ¿Puedo ejecutar el comando zip varias veces, excluyendo/incluyendo ciertos archivos mientras los almaceno en el mismo archivo para lograr lo que quiero?
PD: No puedo tener una cremallera dentro de la cremallera. Una vez descomprimido, el proyecto debe ser utilizable y no requerir descomprimir un zip contenido.
Cosas que he probado:
zip -rq4y $ZIPFILE $TARGETFOLDER/xx.framework
zip -rq4u $ZIPFILE $TARGETFOLDER
La idea era comprimir primero el .framework, preservando los enlaces simbólicos. Luego actualice el archivo para agregar el resto de los archivos, incluidos los archivos/carpetas a los que apuntan los enlaces simbólicos que aún no están en el archivo (o eso esperaba). Resultado: archivo corrupto (Error 20: no es un directorio).
También intenté lo contrario, excluyendo el marco en la primera pasada y luego actualizando el archivo con el marco:
zip -rq4 $ZIPFILE $TARGETFOLDER -x xx.framework
zip -rq4uy $ZIPFILE $TARGETFOLDER
Resultado: archivo corrupto (Error 21: es un directorio).
Respuesta1
¡Entendido!
Un problema fue que utilicé el formato de exclusión incorrecto; con el asterisco inicial y final, esta solución funciona:
zip -rq4 $ZIPFILE $TARGETFOLDER -x *xx.framework*
zip -rq4uy $ZIPFILE $TARGETFOLDER -i *xx.framework*
Entonces, primero comprime la carpeta excluyendo el marco, copiando todos los archivos/carpetas con enlaces simbólicos en el archivo.
La segunda línea actualiza el archivo con la y
bandera (almacena enlaces simbólicos en lugar de archivos/carpetas a las que apunta). Explícitamente solo incluyo la carpeta framework, puede que esto no sea necesario pero creo que es más limpio y posiblemente más rápido.