Como atualizar um arquivo em um arquivo zip

86

É 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

user577732
fonte
3
você pode alterar o título da pergunta para algo mais significativo?
tokland
7
Além disso, a pergunta poderia ter sido uma ou duas frases. Cerca de 80% dele é divagar.
Pausado até novo aviso.

Respostas:

62

Do CEP (1) :

Quando recebe o nome de um arquivo zip existente, o zip substitui entradas com nomes idênticos no arquivo zip ou adiciona entradas para novos nomes.

Portanto, apenas use o zipcomando 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.

Fique por favor
fonte
5
Alguém poderia dar um exemplo, por favor? Não entendo a ajuda do comando zip.
Gustave
12
Digamos que você compactou myfolder usando zip -r myfolder.zip myfolderse deseja atualizar myfolder/otherfolder/myfile.txt, vá em frente e edite o arquivo e executezip -r myfolder.zip myfolder/otherfolder/myfile.txt
eakkas
1
Como fazer isso se o arquivo a ser substituído não tem o mesmo nome nem a mesma estrutura que o arquivo a ser repalimentado?
Fractaliste
2
@Fractaliste Você deve fazer com que tenha o mesmo nome e estrutura;)
Hack5,
72

Eu descobri que o ziparquivo do Linux é complicado para substituir um único arquivo em um zip. O jarutilitário do Java Development Kit pode ser mais fácil. Considere a tarefa comum de atualização WEB/web.xmlem um arquivo JAR (que é apenas um arquivo zip):

jar -uf path/to/myapp.jar -C path/to/dir WEB-INF/web.xml

Aqui, path/to/direstá o caminho para um diretório que contém o WEB-INFdiretório (que por sua vez contém web.xml).

Cayhorstmann
fonte
e se eu tiver que copiar apenas o arquivo em vez de criar um diretor WEB-INFque tenha esse arquivo.
Mão amiga
Também no meu caso, o velho utilitário "jar" fez o truque! Obrigado!
bitfox
51

Experimente o seguinte:

zip [zipfile] [file to update] 

Um exemplo:

$ zip test.zip test/test.txt
updating: test/test.txt (stored 0%)
WizardsOfWor
fonte
2
Este é o mais fácil de entender graças ao exemplo, obrigado!
vatsug 01 de
2
Leve em consideração que você deve ver ao updating:invés de adding:se deseja atualizar um arquivo dentro do zip; caso contrário, você estará adicionando arquivos ao zip, não substituindo-o.
Edenshaw
Você está certo, eu não percebi isso. Atualizado, obrigado!
WizardsOfWor
13

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. Copiados file.zippara abce extraiu o arquivo no diretório. Eu editei o arquivo que queria editar. Então, enquanto estava dentro abc, executou o seguinte comando

user@host ~/temp/abc $ zip -u file.zip
updating: content/js/ (stored 0%)
updating: content/js/moduleConfig.js (deflated 69%)

-u switch irá procurar por arquivos alterados / novos e irá adicionar ao arquivo zip.

tradicional
fonte
11

Use o sinalizador de atualização: -u

Exemplo:

zip -ur existing.zip myFolder

Este comando irá compactar e adicionar myFolder(e seu conteúdo) ao existing.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 -usinalizador. 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 -ubandeira. Novamente, apenas os arquivos alterados serão compactados.

Exemplo:

Estrutura da fonte original


ParentDir
├── file1.txt
├── file2.txt
├── ChildDir
│   ├── file3.txt
│   ├── Logs
│   │   ├── logs1.txt
│   │   ├── logs2.txt
│   │   ├── logs3.txt

Estrutura de fonte atualizada


ParentDir
├── file1.txt
├── file2.txt
├── ChildDir
│   ├── file3.txt
│   ├── Logs
│   │   ├── logs1.txt
│   │   ├── logs2.txt
│   │   ├── logs3.txt 
│   │   ├── logs4.txt <-- NEW FILE 

Uso

$ zip -ur existing.zip ParentDir 
> updating: ParentDir/ChildDir/Logs (stored 0%)
>   adding: ParentDir/ChildDir/Logs/logs4.txt (stored 96%)
Ethan Strider
fonte
5

Você pode usar: zip -u file.zip path / file_to_update

Renato Luiz Ramos
fonte
1

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 é

zip -f /myfiles/myzip.zip
gvrocha
fonte
0

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.

Nickolay Olshevsky
fonte
0

7zip (7za) pode ser usado para adicionar / atualizar arquivos / diretórios muito bem:

Exemplo: Substituindo (independentemente da data do arquivo) o MANIFEST.MFarquivo em um arquivo JAR. O /source/META-INFdiretório contém o MANIFEST.MFarquivo que você deseja colocar no jar(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/
mzsolt
fonte
-2

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.

O surricano
fonte