Comprimir archivos en OSX, quiere 'resolver' enlaces simbólicos

2

Tengo varios directorios, todos son demos de scripts web que he creado, lo importante es que todos comparten recursos. Así que he creado un directorio de recursos globales y he vinculado simbólicamente ese directorio a cada una de las carpetas de demostración.

Lo que quiero hacer es comprimir cada directorio de demostración en un .ziparchivo, el problema que tengo es que los enlaces simbólicos se mantienen en el archivo zip y en otra máquina el directorio de recursos simplemente no existiría.

¿Hay alguna manera de comprimir una carpeta de demostración con los enlaces simbólicos resueltos para que, al descomprimirlos, los archivos aparezcan como si fueran parte de la estructura de archivos estándar?

Muchas gracias :-)

Ben Everard
fuente

Respuestas:

6

Un par de preguntas: 1) ¿La estructura de carpetas que está archivando utiliza enlaces simbólicos internamente para ahorrar espacio? (Por "internamente", quiero decir, dada una carpeta raíz particular, ¿los enlaces simbólicos dentro de esa carpeta raíz solo se refieren a otros archivos o directorios que también están dentro de esa carpeta?).

2) ¿Cómo está creando el archivo .zip en OS X? (Usando una herramienta de línea de comando, y si es así, cuál, o usando Archive Utility, etc.)

3) ¿Qué sistema operativo está ejecutando la computadora de destino (donde se descomprimirá el archivo) y qué método está utilizando para descomprimir el archivo allí?

En primer lugar, en OS X, los enlaces simbólicos son básicamente archivos de texto sin formato con información adicional de "Mac" que le permite a OS X saber que debe tratar el archivo como un enlace simbólico. Esta información adicional de Mac es un tipo de archivo especial, un código de creador e información de indicador de Finder, que no se almacena en el archivo en sí, sino en el directorio del disco HFS +.

En OS X, cuando crea un archivo .zip, no hay espacio en la secuencia zip para esta información adicional de Mac, por lo que, en cierto sentido, el enlace simbólico se almacena dentro del archivo zip como un archivo sin formato. Si alguien en otra Mac puede descomprimir el archivo y hacer que represente adecuadamente la estructura original parece depender de quién o qué utilizas para descomprimirlo.

Por ejemplo, hace aproximadamente un mes, una compañía lanzó un juego sobre Steam, el software de distribución de juegos de Valve. El paquete de la aplicación del juego incluía la biblioteca Cg de NVIDIA en forma de marco, que internamente usa enlaces simbólicos. Originalmente había un problema con Steam que no restauraba correctamente la información necesaria de Mac en Trine.app como se menciona en este hilo: http://forums.steampowered.com/forums/showthread.php?t=1556083

La imagen a continuación muestra 2 copias diferentes del marco Cg., una que instalé por separado del sitio web de NVIDIA (imagen superior), y la imagen inferior muestra lo que se recibió con el juego:

texto alternativo

Tenga en cuenta que todos los elementos coinciden, pero lo que deberían ser enlaces simbólicos son archivos de datos simples.

Después de mirar más de cerca el registro FSCatalogInfo para ambos elementos, me quedó claro cuál era el problema:

texto alternativo

Notarás en la imagen superior que el comienzo de la estructura finderInfo tiene los siguientes valores:

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

Estos valores se definen en /usr/include/hfs/hfs_format.h:

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

El valor del noveno byte, 0x80, corresponde a la kIsAliasbandera de finderInfo.finderFlags. Ese valor se define en /System/Library/Frameworks/CoreServices.framework/.../CarbonCore.framework/.../Headers/Finder.h:

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

Parece que la función de descomprimir incorporada en OS X (utilidad de archivo) está codificada para buscar posibles archivos en el archivo que se está descomprimiendo que representen enlaces simbólicos, y para configurar la información adecuadamente. Creo que /usr/bin/ditto(cuando se usa por su capacidad de archivar archivos) también se encarga de esto por usted. No estoy seguro de si zipo unzipsi.

NSGod
fuente
5

Este es el comportamiento predeterminado para Info-ZIP zip. En su lugar, debe aprobar -yo --symlinksalmacenar enlaces simbólicos dentro del archivo.

Ignacio Vazquez-Abrams
fuente
3

Ayuda Zip lee:

-y almacenar enlaces simbólicos como el enlace en lugar del archivo referenciado

Pete Ashdown
fuente
Gracias por su respuesta, cuando ejecuto el siguiente comando, zip -r -y demo.zip demo/el enlace simbólico aparece como un archivo, no como un directorio. El archivo no tiene icono ni tipo de archivo: S
Ben Everard
2
@ILMV: ¿No es -yexactamente lo contrario de lo que quieres lograr?
Daniel Beck