我有一个名为'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”在一个命令中完成)
答案1
使用通常的命令行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 文件操作库。例如,Perl 与存档::Zip。省略错误检查。
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 文件就足够了,您可以在另一侧使用zip
或。unzip
AVFS为许多存档格式提供只读支持。
mountavfs
target_zip=$PWD/targetZip.zip
(cd "$HOME/.avfs$PWD/sourceZip.zip#" &&
zip -g "$target_zip" .) # or list the files, as above
umountavfs
保险丝拉链提供对 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"
警告:我直接在浏览器中输入这些脚本。使用风险自负。
答案2
不确定添加存档,但您随时可以重新创建一个
unzip a.zip -d tmp
unzip b.zip -d tmp
zip -r c.zip tmp
前两行将档案解压到tmp
目录中,第三行将其打包回来。
答案3
有一个工具zipmerge
可以做到这一点。页面的描述man
是:
zipmerge 将源 zip 归档文件 source-zip 合并到目标 zip 归档文件 target-zip 中。默认情况下,源 zip 存档中的文件会覆盖目标 zip 存档中的同名现有文件。
答案4
我要直截了当地说,从实际角度来看,我不知道答案。
但是,从理论角度来看,您肯定必须解压缩并重新压缩文件。您肯定不能将它们移动到压缩状态吗?首先,您必须假设两个 zip 文件在压缩模式和级别方面具有相同的设置。
您可以将 unzip 和 zip 命令链接在一起,但这就变成了在命令行上处理命令的问题,对此我将听从 *nix 专家的意见。
我随时准备接受纠正。