Como compactar um arquivo enquanto mantém alguns links simbólicos, mas não outros? (OS X)

1

Estou usando a ferramenta de linha de comando zip no OS X para compactar uma pasta de projeto Xcode.

Esta pasta contém um arquivo .framework para o OS X, que inclui links simbólicos como xx.framework/Versions/Current , que aponta para xx.framework/Versions/A . Quando eu zip o projeto e, em seguida, descompacte-o, as Versões / A e Versões / Atual contêm o mesmo conjunto de arquivos - basicamente elas são contidas duas vezes no arquivo - eu preciso evitar isso.

No entanto, eu também tenho symlinks na pasta do projeto apontando para arquivos de recursos que precisam ser copiados no arquivo zip. Portanto, não posso usar apenas os sinalizadores zip globais para armazenar os links simbólicos em vez dos arquivos / dirs apontados.

Como posso criar um único arquivo ZIP onde apenas alguns links simbólicos são armazenados enquanto outros armazenam o conteúdo para o qual eles apontam?

Isso é possível com o zip? Existe outra ferramenta compatível com zip que eu poderia usar? Eu poderia executar o comando zip várias vezes, excluindo / incluindo certos arquivos ao armazenar os arquivos no mesmo arquivo para obter o que eu quero?

PS: Eu não posso ter um zip dentro do zip. Uma vez descompactado, o projeto deve ser utilizável e não requer descompactar um zip contido.

Coisas que eu tentei:

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

A idéia era fechar o arquivo .framework primeiro, preservando os links simbólicos. Em seguida, atualize o arquivo para adicionar o restante dos arquivos, incluindo quaisquer arquivos / pastas apontados por links simbólicos que ainda não estejam no arquivo (ou assim eu esperava). Resultado: arquivo corrompido (Erro 20 - Não é um diretório).

Eu também tentei o contrário, excluindo a estrutura na primeira passagem e atualizando o arquivo com a estrutura:

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

Resultado: arquivo corrompido (Erro 21 - É um diretório).

    
por LearnCocos2D 03.06.2015 / 14:43

1 resposta

2

Gotcha!

Um problema é que usei o formato de exclusão incorreto, com o asterisco inicial e final dessa solução:

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

Primeiro, ele fecha a pasta excluindo a estrutura, copiando todos os arquivos / pastas com links simbólicos para o arquivo.

A segunda linha atualiza o arquivo com o y flag (armazenar links simbólicos em vez de arquivos / pastas apontados). Eu explicitamente incluo apenas a pasta do framework, isso pode não ser necessário, mas eu acho que é mais limpo e possivelmente mais rápido.

    
por 03.06.2015 / 15:08