我有一个游戏模组的文件。此模组要求一些音乐文件在不同的文件夹中出现两次。假设两个文件夹中的音乐相同,是否有办法将文件压缩一次,然后更改目录并引用另一个副本,这样如果我提取 zip 文件,它会提取两次文件,但实际上它们在 zip 中只出现一次?
类似于创建具有修改后的 TOC 的 ISO(虽然我也不知道该怎么做)
zip 文件的示例:
mod.zip
\music\set_a\tune1.mp3
\music\set_a\tune2.mp3
\music\set_a\tune3.mp3
\music\set_a\tune4.mp3
\music\set_a\tune5.mp3
\music\set_a\tune6.mp3
\music\set_b\tune1.mp3
\music\set_b\tune2.mp3
\music\set_b\tune3.mp3
\music\set_b\tune4.mp3
\music\set_b\tune5.mp3
\music\set_b\tune6.mp3
\graphics\set_a\img1.png
\graphics\set_a\img2.png
\graphics\set_b\img1.png
\graphics\set_b\img2.png
set_a
想象一下和的曲调相同,但和的set_b
图形不相同。set_a
set_b
在理想情况下,我会set_b
用 0 长度文件替换中的所有 mp3 文件,然后在创建 zip 文件后,我会更改索引并使其引用数据set_a
,以便在提取时它会创建music\set_b\tune1.mp3
,但使用的数据music\set_a
。
这可能吗?如果不可能,还有其他简单的方法可以创建类似的东西吗?
答案1
可能一个简单的替代方案是使用“固定”存档格式。这始终是 .tar.foo 存档的工作方式,并且是 .rar 和 .7z 格式的可选选项。
在这种模式下,档案的内容被连接在一起并压缩为单个连续的流,这意味着跨文件也会检测到重复 - 并且相同的文件应该作为常规压缩的一部分进行重复数据删除。
(这种模式的缺点是,它使得提取个人文件速度很慢,并且档案无法轻松更新。
笔记:其他线程(已关闭)的答案是,这只适用于与字典大小参数相比相对较少的数据。但至少它比对已经很糟糕的 .zip 结构进行非标准更改的风险要小。
答案2
赞巴克它可以为您完成这项工作,它具有内置的重复数据删除功能,它是开源的,并且至少可以在 Windows 和 Linux 上运行(可能已经打包)。
这是对 Linux 的快速检查:
$ dd if=/dev/urandom bs=1M of=file1 count=10
$ cp file1 file2
$ zpaq add archive.zpaq file1 file2
$ ls -lh archive.zpaq
查看档案的大小。另请注意,我们没有提供任何有关文件重复的信息,也没有软/硬链接。
$ rm file1 file2
$ zpaq extract archive.zpaq
$ ls -lh file1 file2