Existe uma maneira de editar arquivos dentro de um arquivo zip sem extraí-los explicitamente primeiro?


47

Às vezes, preciso fazer alterações em um arquivo .zip ou .jar, portanto, geralmente, movo o arquivo para /tmp, extraio todos os arquivos unzip, edito alguns arquivos e, em seguida, zipamos novamente os arquivos. Isso funciona, mas pode ser entediante. Existe um utilitário ou script de shell que eu possa usar para editar um arquivo dentro de um arquivo zip sem chamar explicitamente unzipe zip(mesmo que seja apenas um invólucro em torno desses comandos)?


Apenas curioso se a resposta funciona em arquivos .jar? (Eu não testá-lo lá.)
Beroe

@beroe Deveria, pois aqueles usam o algoritmo de compactação zip. Essa foi realmente a minha principal motivação para procurar uma solução, porque eu tinha arquivos .war implantados em um servidor de aplicativos que eu não tinha vontade de re-empacotar e reimplementar apenas para modificar um único arquivo.
austin

Ótimo. Vou tentar corrigir a função para preservar a estrutura de diretórios dentro do arquivo morto. Atualmente, acho que funciona apenas em arquivos no nível raiz, mas para meus propósitos, as subpastas são mais úteis.
Beroe

@beroe Isso é muito legal. Antes de perguntar isso, eu ia codificar um script python para iniciar um psudo-shell "dentro" do arquivo zip para executar comandos arbitrários. Eu estaria interessado no que você criar.
austin

OK, adicionou outra solução para oferecer suporte a subpastas e funciona em testes limitados .
Beroe

Respostas:


19

Você sabe o nome do arquivo no arquivo morto antes de descompactá-lo? Você pode criar uma função para descompactar /tmp, editar e atualizar o zip:

zipedit(){
    echo "Usage: zipedit archive.zip file.txt"
    unzip "$1" "$2" -d /tmp 
    vi /tmp/$2 && zip -j --update "$1"  "/tmp/$2" 
}

Como diz, o uso é:

zipedit myarchive.zip myfile.txt

Isso descompacta o arquivo nomeado do arquivo morto, salva-o /tmp, edita-o e videpois o adiciona de volta ao arquivo morto, enquanto "junking" o caminho. Adicione ao seu .bash_profile, assumindo bash...

EDIT: Abaixo está uma versão que funciona com subpastas dentro do arquivo morto ... Nota, não use uma barra antes do nome da pasta (por exemplo, myfolder/file.txtnão use /myfolder/file.txt). Se você editar um arquivo que ainda não existia no arquivo morto, ele será criado para você. Também não tenho certeza se ele funcionará com o caminho absoluto para o arquivo zip. Melhor ficar com parente.

zipedit(){
    echo "Usage: zipedit archive.zip folder/file.txt"
    curdir=$(pwd)
    unzip "$1" "$2" -d /tmp 
    cd /tmp
    vi "$2" && zip --update "$curdir/$1"  "$2" 
    # remove this line to just keep overwriting files in /tmp
    rm -f "$2" # or remove -f if you want to confirm
    cd "$curdir"
}

Obrigado pela pergunta. Provavelmente vou acabar usando esse também!

Outra edição: não testado, mas li isso vime emacsambos editarão arquivos jar diretamente?


Posso confirmar que o vim funciona esplêndido para editar arquivos zip a partir da linha de comando no Linux, muito obrigado pela dica!
Thomas Bindzus

60

O Vim suporta a edição transparente de arquivos dentro de arquivos zip. Basta executar:

vim file.zip

e você verá uma lista de arquivos dentro do arquivo zip. Escolha o que você deseja editar, altere o que deseja e saia com: x

Se vimresponder com:

Não é possível fazer alterações, 'modificável' está desativado

.. basta executar :set modifiableou :set ma(fonte: https://stackoverflow.com/questions/5745506/vim-modifiable-is-off )


2
A propósito, o suporte a zip padrão no vim só permite editar ZIPs de um nível. Se você precisar editar ZIPs dentro de ZIPs, use este plugin vim .
jesjimher

11
O mesmo acontece com o emacs.
Mike

4
Este deve ser marcado como a resposta certa
Martijn Burger

3
salva-vidas. muito legal recurso do vim, e bastante inesperado demais
Peter Perháč

4

Resposta curta: NÃO.

Se for um invólucro, você está chamando esses comandos. De qualquer forma, o melhor que consigo pensar é abrir o arquivo usando file-roller, se você estiver em um ambiente X, que possa funcionar com um simples clique duplo, dependendo da configuração. Você pode clicar duas vezes no arquivo compactado para abri-lo e editá-lo:

$ file-roller b3.zip 

Ao salvar seu arquivo editado, você deverá obter esta caixa de diálogo:

Você também pode criar um script para isso, mas isso fica complicado se você tiver arquivos compactados que contenham vários arquivos. Deixe-me saber se é isso que você precisa e eu posso preparar algo.

insira a descrição da imagem aqui


0

Resposta pedante curta; não. Se você pensa em compactação, está usando redundância para reduzir os arquivos internos, para que qualquer edição altere o arquivo inteiro dentro do arquivo morto, possivelmente o arquivo morto.

Se você está sendo menos teórico, mais prático, mais "Eu não quero ter que descompactar manualmente / zipar", existem ferramentas que você pode usar. ark no Linux é um que eu usei. Você também pode montar o arquivo com fuse-zip , embora provavelmente seja mais trabalhoso que um arquivo temporário.


não sei por que alguém deu -1. +1 para fuse-zip.
myrdd 11/02

0

De acordo com a página do manual zip(versão online para fácil referência: http://linux.die.net/man/1/zip ), o zipcomando possui um -usinalizador que descreve como:

Substitua (atualize) uma entrada existente no arquivo compactado apenas se ela tiver sido modificada mais recentemente do que a versão já existente no arquivo compactado.


0

O gerenciador de arquivos do Directory Opus 12 permitirá que você navegue no Zip, arraste e solte o arquivo editado de outra pasta nele e sobrescreva o arquivo que deseja editar e fará tudo em tempo real. Muito fácil



0

Você pode usar o editor de texto padrão do KDE, por exemplo:

  1. arquivo aberto no gerenciador de arquivos
  2. abrir arquivo de texto no editor de interface gráfica do KDE
  3. salvar arquivo de texto e sistema pedir para atualizar o arquivo - clique em sim
  4. não se esqueça da permissão para arquivar e pasta do arquivo (meu erro favorito)

Corrija a formatação na sua postagem.
Davidbaumann
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.