Copier un file d'un zip à l'autre?

J'ai un file nommé 'sourceZip.zip'

Ce file ( 'sourceZip.zip' ) contient deux files:

'textFile.txt'

'binFile.bin'


J'ai aussi un file nommé 'targetZip.zip'

Ce file ( 'targetZip.zip' ) contient un file:

'jpgFile.jpg'


Dans linux, quelle command bash dois-je utiliser pour copyr les deux files ( 'textFile.txt' , 'binFile.bin' ) de l'archive source ( 'sourceZip.zip' ) directement dans la deuxième archive ( 'targetZip.zip' de sorte qu'à la fin du process, la deuxième archive ( 'targetZip.zip' ) inclura les trois files?

(idéalement, cela se ferait en une seule command, en utilisant 'zip' ou 'unzip')

En utilisant l'outil de zip command line habituel, je ne pense pas que vous puissiez éviter des commands d'extraction et de mise à jour séparées.

 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" 

Il existe d'autres langues avec des bibliothèques de manipulation de files zip plus pratiques. Par exemple, Perl avec Archive :: Zip . La vérification d'erreur est omise.

 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(); 

Une autre façon consiste à monter les files zip en tant que directorys. Montage de l'un des files zip est suffisant, vous pouvez utiliser zip ou unzip de l'autre côté. Avfs fournit un support en lecture seule pour de nombreux formats d'archives.

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

Fuse-zip fournit un access en lecture-écriture aux archives zip, de sorte que vous pouvez copyr les files avec 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" 

Attention: j'ai tapé ces scripts directement dans mon browser. À utiliser à vos risques et périls.

Pas sûr d' append à l'archive, mais vous pouvez toujours recréer un

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

Les deux premières lignes décompressent les archives dans le tmp et la troisième les recompose.

Il y a un outil appelé zipmerge qui peut le faire. La description de la page de manuel est:

zipmerge fusionne la source zip archives source-zip dans l'archive zip cible target-zip. Par défaut, les files des archives zip source écrasent les files existants du même nom dans l'archive zip cible.

Je vais dire tout de suite que je ne connais pas la réponse, d'un sharepoint vue pratique.

Cependant, d'un sharepoint vue théorique, vous devrez sûrement décompresser et re-compresser les files. Vous ne pouvez pas simplement les déplacer en état zippé, sûrement? Pour commencer, vous devez supposer que les deux files zip ont des parameters identiques en ce qui concerne le mode de compression et le niveau.

Vous pouvez éventuellement enstringr les commands de décompression et zip, mais cela devient une question de jonglage autour des commands sur la command line, pour lesquelles je vais m'adresser aux experts * nix.

Je suis très prêt à être corrigé.