Zipando arquivos no OSX, quer 'resolver' links simbólicos

2

Eu tenho vários diretórios, todos são demos de scripts da web que eu criei, o fato importante é que eles compartilham recursos. Então eu criei um diretório global de recursos e vinculei simbolicamente esse diretório em cada uma das pastas de demonstração.

O que eu quero fazer é compactar cada diretório demo em um arquivo .zip , o problema que tenho é que os links simbólicos são mantidos no arquivo zip e em outra máquina o diretório de recursos simplesmente não existiria.

Existe uma maneira de compactar uma pasta demo com qualquer link simbólico resolvido, assim, quando descompactado, os arquivos aparecem como se fossem parte da estrutura de arquivos padrão?

Muito obrigado: -)

    
por Ben Everard 16.12.2010 / 00:20

3 respostas

6

Algumas perguntas: 1) A estrutura de pastas que você está arquivando usa links simbólicos internamente para economizar espaço? (Por "internamente", quero dizer, dada uma determinada pasta raiz, os links simbólicos dentro dessa pasta raiz referem-se apenas a outros arquivos ou diretórios que também estão dentro dessa pasta?).

2) Como você está criando o arquivo .zip no OS X? (Usando uma ferramenta de linha de comando e, em caso afirmativo, qual deles, ou usando o Utilitário de Arquivo, etc.)

3) Qual sistema operacional é o computador de destino (onde o arquivo será descompactado) em execução, e qual método você está usando para descompactar o arquivo?

Em primeiro lugar, no OS X, os links simbólicos são basicamente arquivos de texto simples com alguma informação extra "Mac" que permite ao OS X saber que deve tratar o arquivo como um link simbólico. Essa informação extra do Mac é um tipo de arquivo especial, código do criador e informações de sinalizador do Finder, que não são armazenadas no próprio arquivo, mas no diretório de disco HFS +.

No OS X, quando você cria um arquivo .zip, não há espaço no fluxo zip para essas informações extras do Mac, portanto, em certo sentido, o link simbólico é armazenado no arquivo zip como um arquivo simples. Se alguém em outro Mac pode descompactar o arquivo e representá-lo corretamente, a estrutura original parece depender de quem ou o que você usa para descompactá-lo.

Por exemplo, há um mês ou mais, uma empresa lançou um jogo no Steam, o software de distribuição de jogos da Valve. O pacote de aplicativos do jogo incluía a biblioteca Cg da NVIDIA na forma de uma estrutura, que usa internamente links simbólicos. Houve originalmente um problema com o Steam não restaurando corretamente as informações necessárias do Mac no Trine.app, como mencionado neste tópico: link

A imagem abaixo mostra 2 cópias diferentes do arquivo Cg, uma que eu instalei separadamente do site da NVIDIA (imagem superior), e a imagem inferior mostra o que foi recebido com o jogo:

Observequetodosositenscorrespondem,masoquedeveserlinkssimbólicossãoarquivosdedadossimples.

DepoisdeolharmaisdepertooregistroFSCatalogInfoparaosdoisitens,ficouclaroparamimqualeraoproblema:

Você notará na imagem superior que o início da struct finderInfo possui os seguintes valores:

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

Estes valores estão definidos em /usr/include/hfs/hfs_format.h:

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

O valor do 9º byte, 0x80, corresponde ao sinal kIsAlias do finderInfo.finderFlags . Esse valor é definido em /System/Library/Frameworks/CoreServices.framework /.../ CarbonCore.framework /.../ Headers / Finder.h:

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

Parece que o recurso de descompactação integrado ao OS X (Archive Utility) é codificado para procurar por possíveis arquivos no archive que está sendo descompactado, que representam links simbólicos e para definir as informações adequadamente. Eu acredito que /usr/bin/ditto (quando usado por sua capacidade de arquivar arquivos) também cuida disso para você. Não tenho certeza se zip ou unzip do.

    
por 16.12.2010 / 02:38
5

Este é o comportamento padrão para zip do Info-ZIP. Você precisa passar -y ou --symlinks para armazenar links simbólicos no arquivo morto.

    
por 16.12.2010 / 00:22
3

A ajuda do Zip lê:

-y store symbolic links as the link instead of the referenced file

    
por 16.12.2010 / 00:23