É possível substituir um arquivo em um arquivo zip sem descompactar, excluir o arquivo antigo, adicionar o novo arquivo e compactá-lo novamente?
A razão é que eu tenho um arquivo zip que é muito grande, há um xml dentro do arquivo zip que tenho que atualizar às vezes. Descompactar o zíper e rezipá-lo leva muito tempo. Então, eu gostaria de poder substituir o xml dentro do zip por meio de um script. Eu já tenho que verifica se há atualizações no xml que tenho.
Portanto, é possível apenas substituir o xml sem descompactar e compactar novamente?
Desculpe, eu usaria o comando zip para fazer coisas assim, mas o problema é que o script é na verdade para um telefone Android e zip não é um comando que eu posso usar, infelizmente, não o deixei de fora. Eu teria usado o zip definitivamente se pudesse, mas eu só tenho descompactado para droid e há tar no busybox, mas o tar não faz o que eu preciso
Respostas:
Do CEP (1) :
Portanto, apenas use o
zip
comando como faria normalmente para criar um novo arquivo .zip contendo apenas aquele arquivo, exceto o nome de arquivo .zip que você especificar será o arquivo existente.fonte
zip -r myfolder.zip myfolder
se deseja atualizarmyfolder/otherfolder/myfile.txt
, vá em frente e edite o arquivo e executezip -r myfolder.zip myfolder/otherfolder/myfile.txt
Eu descobri que o
zip
arquivo do Linux é complicado para substituir um único arquivo em um zip. Ojar
utilitário do Java Development Kit pode ser mais fácil. Considere a tarefa comum de atualizaçãoWEB/web.xml
em um arquivo JAR (que é apenas um arquivo zip):Aqui,
path/to/dir
está o caminho para um diretório que contém oWEB-INF
diretório (que por sua vez contémweb.xml
).fonte
WEB-INF
que tenha esse arquivo.Experimente o seguinte:
Um exemplo:
$ zip test.zip test/test.txt updating: test/test.txt (stored 0%)
fonte
updating:
invés deadding:
se deseja atualizar um arquivo dentro do zip; caso contrário, você estará adicionando arquivos ao zip, não substituindo-o.Eu sei que essa é uma questão antiga, mas eu queria fazer o mesmo. Atualize um arquivo no arquivo zip. E nenhuma das respostas acima realmente me ajudou.
Aqui está o que eu fiz. Criado diretório temporário
abc
. Copiadosfile.zip
paraabc
e extraiu o arquivo no diretório. Eu editei o arquivo que queria editar. Então, enquanto estava dentroabc
, executou o seguinte comando-u
switch irá procurar por arquivos alterados / novos e irá adicionar ao arquivo zip.fonte
Use o sinalizador de atualização:
-u
Exemplo:
Este comando irá compactar e adicionar
myFolder
(e seu conteúdo) aoexisting.zip
.Uso avançado:
O sinalizador de atualização realmente compara os arquivos de entrada com os existentes e irá adicionar novos arquivos ou atualizar os existentes.
Portanto, se você deseja adicionar / atualizar um subdiretório específico dentro do arquivo zip, basta atualizar a fonte conforme desejado e, em seguida, compactar novamente a fonte inteira com o
-u
sinalizador. Apenas os arquivos alterados serão compactados.Se você não tiver acesso aos arquivos de origem, pode descompactar o arquivo zip, atualizar os arquivos desejados e compactar novamente com a
-u
bandeira. Novamente, apenas os arquivos alterados serão compactados.Exemplo:
Estrutura da fonte original
Estrutura de fonte atualizada
Uso
fonte
Você pode usar: zip -u file.zip path / file_to_update
fonte
Também existe a opção -f que atualizará o arquivo zip. Ele pode ser usado para atualizar TODOS os arquivos que foram atualizados desde que o zip foi gerado (assumindo que eles estejam no mesmo lugar dentro da estrutura em árvore do arquivo zip).
Se o seu arquivo se chamar /myfiles/myzip.zip, tudo o que você precisa fazer é
fonte
Do lado da estrutura do arquivo ZIP - você pode atualizar o arquivo zip sem recompactá-lo, você só precisa pular todos os arquivos anteriores ao arquivo que você precisa substituir, colocar o arquivo atualizado e o restante dos arquivos. E, finalmente, você precisará colocar a estrutura de diretório central atualizada. No entanto, duvido que as ferramentas mais comuns permitam que você faça isso.
fonte
7zip
(7za) pode ser usado para adicionar / atualizar arquivos / diretórios muito bem:Exemplo: Substituindo (independentemente da data do arquivo) o
MANIFEST.MF
arquivo em um arquivo JAR. O/source/META-INF
diretório contém oMANIFEST.MF
arquivo que você deseja colocar nojar
(zip):7za a /tmp/file.jar /source/META-INF/
Apenas atualiza (não substitui o destino se a fonte for mais antiga)
7za u /tmp/file.jar /source/META-INF/
fonte
Sim é possivel.
em sistemas baseados em Linux, basta instalar o zip e você pode chamá-lo na linha de comando. dê uma olhada na página de manual: http://linux.die.net/man/1/zip
mas, na minha experiência pessoal, se possível e a compressão não for tão importante, funciona melhor com arquivos tar simples e tar.
fonte