Linux

將文件從一個 Zip 複製到另一個?

  • October 10, 2012

我有一個文件名為'sourceZip.zip'

此文件 ( 'sourceZip.zip') 包含兩個文件:

'textFile.txt'

'binFile.bin'


我還有一個文件名為'targetZip.zip'

此文件 ( 'targetZip.zip') 包含一個文件:

'jpgFile.jpg'


在 linux 中,我應該使用什麼 bash 命令將兩個文件 ( 'textFile.txt', 'binFile.bin') 從源存檔 ( 'sourceZip.zip') 直接複製到第二個存檔 ( 'targetZip.zip') 中,以便在該過程結束時,第二個存檔 ( 'targetZip.zip') 將包含所有三個文件?

(理想情況下,這將在一個命令中完成,使用 ‘zip’ 或 ‘unzip’)

使用通常的命令行zip工具,我認為您無法避免單獨的提取和更新命令。

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"

還有其他語言具有更方便的 zip 文件操作庫。例如,帶有Archive::Zip的 Perl 。省略了錯誤檢查。

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

另一種方法是將 zip 文件掛載為目錄。掛載其中一個 zip 文件就足夠了,您可以使用zipunzip在另一側使用。Avfs為許多存檔格式提供只讀支持。

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提供對 zip 存檔的讀寫訪問權限,因此您可以使用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"

警告:我直接在瀏覽器中輸入了這些腳本。使用風險自負。

引用自:https://unix.stackexchange.com/questions/7663