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.