压缩包含大量重复文件的文件夹

22

我有一个非常庞大的文件夹(约10GB),其中包含重复的文件,这些文件分布在其目录树的不同子目录中。其中许多文件被重复了多达10次。

如何才能将该文件夹压缩到足够小的大小呢?

我尝试使用Winrar的“最佳”模式,但它并没有压缩它。(相当奇怪)

zip、tar、cab、7z或其他压缩工具是否能做得更好?

我不介意让工具工作几个小时,但不能超过这个时间。

我不想自己以编程方式实现。

6个回答

27

在您的情况下,最好的选择是7-zip。 以下是选项:

7za a -r -t7z -m0=lzma2 -mx=9 -mfb=273 -md=29 -ms=8g -mmt=off -mmtf=off -mqs=on -bt -bb3 archife_file_name.7z /path/to/files

a - 添加文件到存档文件

-r - 递归子目录

-t7z - 设置存档类型(在您的情况下为7z)

-m0=lzma2 - 将压缩方法设置为LZMA2。LZMA是7z格式的默认通用压缩方法。 LZMA方法的主要特点:

  • 高压缩比
  • 可变字典大小(最大可达4 GB)
  • 压缩速度:在2 GHz CPU上约为1 MB/s
  • 解压速度:在2 GHz CPU上约为10-20 MB/s
  • 解压所需的内存要求小(取决于字典大小)
  • 解压的代码大小较小:约为5 KB
  • 支持多线程和P4的超线程技术

-mx=9 - 设置压缩级别。 x = 0表示复制模式(无压缩)。 x = 9 - 超级。

-mfb=273 - 设置LZMA的快速字节数。它可以在5到273之间。正常模式下的默认值为32,最大和超级模式下的默认值为64。通常,较大的数字可以获得稍微更好的压缩比和较慢的压缩过程。

-md=29 - 设置LZMA的字典大小。必须以字节,千字节或兆字节为单位指定大小。字典大小的最大值为1536 MB,但7-Zip的32位版本允许指定高达128 MB字典。 LZMA的默认值为24(16 MB)(正常模式),25(32 MB)(最大模式)(-mx = 7)和26(64 MB)(超级模式)(-mx = 9)。如果您没有从符号集合[b | k | m | g]中指定任何符号,则字典大小将被计算为DictionarySize = 2 ^ Size bytes。要解压缩用LZMA方法压缩的文件,需要有约N个字节的内存(RAM)可用,其中N为字典大小。

我使用md=29,因为我的服务器只有16GB的RAM可用。使用此设置,7-zip仅占用5GB来对任何目录大小进行归档。如果我使用更大的字典大小,则系统会转换到交换区。

-ms=8g - 启用或禁用固实模式。默认模式是s=on。在固实模式下,文件被分组在一起。通常,在固实模式下进行压缩可以提高压缩比。在您的情况下,将固体块大小尽可能大非常重要。

所固定块大小的限制通常会降低压缩比。更新固定的.7z档案可能会很慢,因为它可能需要进行一些重新压缩。

-mmt=off - 将多线程模式设置为关闭。您需要关闭它,因为我们需要由同一个7-zip线程处理相似或相同的文件在一个soled块中。缺点是归档速度慢。无论您的系统有多少个CPU或核心都不重要。

-mmtf=off - 将用于过


1
我发现这个命令创建的文件比先用 7z a -twim name.wim folder/ 创建 .wim 文件,然后再用 -mx=9 -m0=lzma2 压缩它所得到的文件要小。 - Matthew K.
1
“-r”开关可能是不必要的,甚至会导致意外行为。在我的情况下,在Linux下,除了(预期的)压缩TARGET文件夹内容之外,它还会导致(意外的)压缩TARGET SIBLING和TARGET PARENT文件夹内容。来自“man 7za”的警告:“注意:此标志不起作用,避免使用它”。另请参见:"7z:-r标志到底是做什么的?" - Gary

13

6
我建议三种选项(在Windows中已尝试过):
  1. 7zip LZMA2 压缩,字典大小为1536Mb
  2. WinRar “solid” 文件
  3. 7zip WIM 文件
我有10个带有不同版本网站文件夹(包括 .php、.html、.js、.css、.jpeg、.sql等文件),总大小为1Gb(每个文件夹平均100Mb)。虽然标准的7zip或WinRar压缩会给我大约400/500Mb的文件,但这些选项分别给了我一个80Mb、100Mb和170Mb的文件。
更新:感谢@Griffin在评论中的建议,我尝试使用7zip LZMA2压缩(字典大小似乎没有差异)对7zip WIM文件进行压缩。不幸的是,这不是我多年前测试时使用的同一备份文件,但我可以将WIM文件压缩到其大小的70%。我建议您使用特定的文件集尝试这个两步方法,并将其与第一种方法进行比较。
新编辑:我的备份正在增长,现在有许多图像文件。有了30个版本的网站,第1种方法重量为6Gb,而 7zip WIM文件内部的7zip LZMA2文件 的重量仅为2Gb!

你的实心块大小也可能会有所影响。 - jpmc26
1
VIM不会压缩文件,它只是删除重复数据。如果你使用LZMA2压缩VIM文件,最终可能会得到20-40MB的文件大小。因此,首先创建一个VIM归档文件,然后再压缩该VIM归档文件。 - Griffin
@Griffin 很好的建议!我不知道为什么没有自动执行该操作的选项。我会尝试并更新答案 ;) - Leopoldo Sanczyk

4

重复的文件是否具有相同的名称?它们通常小于64 MB吗?那么您应该按文件名(不包括路径)排序,使用tar将所有文件按顺序归档为.tar文件,然后使用xz压缩成一个.tar.xz压缩存档。在.tar文件中相邻并且小于所使用的xz压缩级别的窗口大小的重复文件应该可以压缩到几乎为零。您可以查看xz手册页面中用于压缩级别的字典大小,其范围从256 KB到64 MB。


非常感谢!这帮助我将一个包含许多重复 HTML 文件(相同名称但不同目录)的 tar.gz 压缩档从超过 1 GB 缩小到了 450 MB。 - haraldkl
从您的描述来看,压缩比应该超过二。 - Mark Adler
抱歉,该存档的另一个大部分来自较大的二进制文件(没有重复项)。我没有进行进一步的调查,只是很高兴将数据缩小到适合单个CD。干杯! - haraldkl
tar能够处理硬链接,因此在执行tar之前,我会查找重复文件并创建硬链接。这是我的脚本:for path in path1 path2 path3 ...; do find $path -type f; done | xargs -d'\n' sha1sum | sort | while read -r sha path; do test "$sha" == "$prev_sha" && ln -f $prev_path $path; prev_sha=$sha; prev_path=$path; done - fishautumn

3
WinRAR默认情况下会单独压缩每个文件,因此使用默认设置压缩具有许多相似甚至相同文件的文件夹结构实际上没有真正的优势。

但是,还有创建实体归档的选项。打开WinRAR帮助并在内容选项卡中打开归档类型和参数项目,然后单击实体归档。此帮助页面将解释实体归档是什么以及此归档文件格式具有哪些优点和缺点。

具有较大字典大小和最佳压缩的实体归档可以使包含一系列相似文件的归档文件非常小。例如,我有一个包含327个二进制文件的列表,文件大小从22 KB到453 KB,总共有47 MB,不包括分区的簇大小。我可以将这些327个相似但不完全相同的文件压缩成一个RAR归档文件,字典大小为4 MB,仅为193 KB。当然,这是一个显著的大小减少。

阅读关于固体存档的帮助页面后,点击链接查看有关 rarfiles.lst 的帮助页面。它描述了如何控制文件放入固体存档的顺序。该文件位于 WinRAR 的程序文件夹中,当然可以按照您的需求进行定制。
如果使用 GUI 版本的 WinRAR,还需要注意选项不压缩存储的文件。此选项可以在单击选项卡文件上的符号/命令添加后找到。指定了一些文件类型,例如 *.png、*.jpg、*.zip、*.rar 等,这些文件只是以存档形式存储,没有任何压缩,因为这些文件通常已经以压缩格式存储数据,因此再次压缩它们并没有多大意义。但是,如果在文件夹结构中存在重复的 *.jpg 文件,并且创建了一个固体存档,则将所有文件扩展名从此选项中删除是有意义的。
使用 Rar.exe 控制台版本和 RAR5 存档文件格式的适当命令行应为:
"%ProgramFiles%\WinRAR\Rar.exe a -@ -cfg- -ep1 -idq -m5 -ma5 -md128 -mt1 -r -s -tl -y -- "%UserProfile%\ArchiveFileName.rar" "%UserProfile%\FolderToArchive\"

此示例中使用的开关在WinRAR程序文件目录下的文本文件Rar.txt 中有解释。也可以使用WinRAR.exe,将开关-idq替换为-ibck,如WinRAR上的帮助所述,在打开最后一个菜单帮助并单击第一项菜单帮助主题并展开第一个选项卡内容中的列表项命令行模式和接下来的子列表项开关,并单击第一个项目字母顺序开关列表

顺便说一句:还有像Total CommanderUltraFinderUltraCompare等应用程序,支持通过各种用户可配置的标准搜索重复文件,例如查找具有相同名称和相同大小的文件,或者最安全的是查找具有相同大小和相同内容的文件,并提供删除重复项的功能。


-1

请尝试来自 www.exdupe.com 的 eXdupe,它使用去重技术,并且速度非常快,几乎可以达到磁盘 I/O 的极限。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接