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

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

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

Incluído nessa pasta está um .framework para OS X que inclui links simbólicos como xx.framework/Versions/Currentwhich aponta para xx.framework/Versions/A. Quando eu compactar o projeto e descompactá-lo, tanto as Versões/A quanto as Versões/Atual contêm o mesmo conjunto de arquivos - basicamente eles estão contidos duas vezes no arquivo - preciso evitar isso.

No entanto, também tenho links simbólicos na pasta do projeto apontando para arquivos de recursos que precisam ser copiados no arquivo zip. Portanto, não posso simplesmente usar os sinalizadores zip globais para armazenar os links simbólicos em vez dos arquivos/diretórios 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 apontam?

Isso é possível com zip? Existe outra ferramenta compatível com zip que eu possa usar? Posso executar o comando zip várias vezes, excluindo/incluindo determinados arquivos enquanto os armazeno no mesmo arquivo para conseguir o que desejo?

PS: Não posso ter ziper dentro do zip. Depois de descompactado, o projeto deve ser utilizável e não exigir a descompactação de um zip contido.


Coisas que tentei:

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

A ideia era compactar primeiro o .framework, 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).

Também tentei o contrário, excluindo o framework na primeira passagem e depois atualizando o arquivo com o framework:

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

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

Responder1

Peguei vocês!

Um problema foi que usei o formato de exclusão errado, com o asterisco inicial e final, esta solução funciona:

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

Então, primeiro compacta 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 ysinalizador (armazena links simbólicos em vez de arquivos/pastas apontados). Incluo explicitamente apenas a pasta do framework, isso pode não ser necessário, mas acho que é mais limpo e possivelmente mais rápido.

informação relacionada