Copie um arquivo de um zip para outro?

6

Eu tenho um arquivo chamado 'sourceZip.zip'

Este arquivo ( 'sourceZip.zip' ) contém dois arquivos:

'textFile.txt'

'binFile.bin'

Eu também tenho um arquivo chamado 'targetZip.zip'

Este arquivo ( 'targetZip.zip' ) contém um arquivo:

'jpgFile.jpg'

No linux, que comando bash devo usar para copiar os arquivos ( 'textFile.txt' , 'binFile.bin' ) do arquivo de origem ( 'sourceZip.zip' ) diretamente para o segundo arquivo ( 'targetZip.zip' ), para que no final do processo, o segundo arquivo ( 'targetZip.zip' ) incluirá todos os três arquivos?

(idealmente, isso seria feito em um comando, usando 'zip' ou 'unzip')

    
por user3077 18.02.2011 / 22:29

4 respostas

5

Usando a usual ferramenta de linha de comando zip , não acho que você possa evitar comandos separados de extração e atualização.

source_zip=$PWD/sourceZip.zip
target_zip=$PWD/targetZip.zip
temp_dir=$(mktemp -dt)
( cd "$temp_dir"
  unzip "$source_zip"
  zip -g "$targetZip" .
  # or if you want just the two files: zip -g "$targetZip" textFile.txt binFile.bin
)
rm -rf "$temp_dir"

Existem outros idiomas com bibliotecas de manipulação de arquivos zip mais convenientes. Por exemplo, Perl com Arquivo :: Zip . Erro ao verificar omitido.

use Archive::Zip;
my $source_zip = Archive::Zip->new("sourceZip.zip");
my $target_zip = Archive::Zip->new("targetZip.zip");
for my $member ($source_zip->members()) {
          # or (map {$source_zip->memberNamed($_)} ("textFile.txt", "binFile.bin"))
    $target_zip->addMember($member);
}
$target_zip->overwrite();

Outra maneira é montar os arquivos zip como diretórios. Montar um dos arquivos zip é suficiente, você pode usar zip ou unzip no outro lado. O Avfs fornece suporte somente leitura para muitos formatos de arquivo.

mountavfs
target_zip=$PWD/targetZip.zip
(cd "$HOME/.avfs$PWD/sourceZip.zip#" &&
 zip -g "$target_zip" .)  # or list the files, as above
umountavfs

O zip com fusível fornece acesso de leitura / gravação aos arquivos zip, para que você possa copiar os arquivos com cp .

source_dir=$(mktemp -dt)
target_dir=$(mktemp -dt)
fuse-zip sourceZip.zip "$source_dir"
fuse-zip targetZip.zip "$target_dir"
cp -Rp "$source_dir/." "$target_dir" # or list the files, as above
fusermount -u "$source_dir"
fusermount -u "$target_dir"
rmdir "$source_dir" "$target_dir"

Aviso: eu digitei esses scripts diretamente no meu navegador. Use a seu próprio risco.

    
por 18.02.2011 / 23:27
4

Não tenho certeza sobre adicionar ao arquivamento, mas você sempre pode recriar um

unzip a.zip -d tmp
unzip b.zip -d tmp
zip -r c.zip tmp

As primeiras duas linhas descompactam os arquivos em tmp dir e a terceira os empacota.

    
por 18.02.2011 / 22:37
2

Existe uma ferramenta chamada zipmerge que pode fazer isso. A descrição da página man é:

zipmerge merges the source zip archives source-zip into the target zip archive target-zip. By default, files in the source zip archives over- write existing files of the same name in the target zip archive.

    
por 10.10.2012 / 19:41
0

Eu vou dizer imediatamente que não sei a resposta, de um ponto prático.

No entanto, do ponto de vista teórico, certamente você teria que descompactar e zipar novamente os arquivos. Você não pode simplesmente movê-los em estado de zip, com certeza? Para começar, você deve assumir que os dois arquivos zip tinham configurações idênticas em relação ao modo e nível de compactação.

Você poderia encadear os comandos unzip e zip juntos, mas então isso se torna uma questão de malabarismo em torno dos comandos na linha de comando, pelos quais eu irei me deferir com os especialistas * nix.

Estou muito pronto para ser corrigido.

    
por 18.02.2011 / 22:37