【问题标题】:Compressing a folder with many duplicated files [closed]压缩包含许多重复文件的文件夹[关闭]
【发布时间】:2015-02-11 23:19:30
【问题描述】:

我有一个相当大的文件夹(~10GB),其中包含许多重复的文件,遍及它的目录树。其中许多文件重复了 10 次。重复的文件不是并排的,而是在不同的子目录中。

如何将文件夹压缩到足够小?

我尝试在“最佳”模式下使用 Winrar,但它根本没有压缩它。 (很奇怪)

zip\tar\cab\7z\ 任何其他压缩工具会做得更好吗?

我不介意让该工具工作几个小时 - 但不会更多。

我宁愿自己不以编程方式进行

【问题讨论】:

    标签: compression tar rar winrar winzip


    【解决方案1】:

    在您的情况下,最佳选择是 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),在最大模式下 (-mx=7) 下为 25 (32 MB),在超级模式下 (-mx=9) 下为 26 (64 MB)。如果您不指定集合 [b|k|m|g] 中的任何符号,则字典大小将计算为 DictionarySize = 2^Size 字节。解压字典大小为 N 的 LZMA 方法压缩的文件,需要大约 N 字节的可用内存(RAM)。

    我使用md=29,因为在我的服务器上只有 16Gb 可用 RAM。使用此设置 7-zip 在任何目录大小的归档中仅占用 5Gb。如果我使用更大的字典大小 - 系统将进行交换。

    -ms=8g - 启用或禁用固态模式。默认模式为s=on。在实体模式下,文件被组合在一起。通常,以固态模式压缩会提高压缩比。在您的情况下,这对于使实体块尽可能大非常重要。

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

    -mmt=off - 将多线程模式设置为关闭。您需要将其关闭,因为我们需要在一个单独的块中由相同的 7-zip 线程处理相似或相同的文件。缺点是存档速度慢。与您的系统有多少 CPU 或内核无关。

    -mmtf=off - 将过滤器的多线程模式设置为OFF

    -myx=9 - 将文件分析级别设置为最高,分析所有文件(增量和可执行过滤器)。

    -mqs=on - 在实体档案中按类型对文件进行排序。将相同的文件存储在一起。

    -bt - 显示执行时间统计 -bb3 - 设置输出日志级别

    【讨论】:

    • 我发现这个命令创建的文件比首先创建一个 .wim 文件(使用7z a -twim name.wim folder/)然后使用-mx=9 -m0=lzma2 压缩它要小。
    • -r 开关可能是不必要的,甚至会导致意外行为。就我而言,在 Linux 下,除了(预期)压缩目标文件夹内容外,它还导致(意外)压缩目标 SIBLING 和目标父文件夹内容。来自man 7zaCAUTION: this flag does not do what you think, avoid using it。另请参阅:"7z: What does the -r flag do?"
    【解决方案2】:

    7-zip 支持“WIM”文件格式,可以检测和“压缩”重复项。如果您使用的是 7-zip GUI,那么您只需选择“wim”文件格式。

    仅当您使用命令行 7-zip 时,请查看此答案。 https://serverfault.com/questions/483586/backup-files-with-many-duplicated-files

    【讨论】:

      【解决方案3】:

      我建议我尝试过的 3 个选项(在 Windows 中):

      1. 7zip LZMA2 压缩,字典大小为 1536Mb
      2. WinRar“实体”文件
      3. 7zip WIM 文件

      我有 10 个文件夹,其中包含不同版本的网站(包含 .php.html.js、.css、.jpeg.sql 等),总大小为 1Gb(每个文件夹平均 100Mb)。虽然标准 7zip 或 WinRar 压缩给了我一个大约 400/500Mb 的文件,但这些选项分别给了我一个 (1) 80Mb、(2) 100Mb 和 (3) 170Mb 的文件。

      更新编辑:感谢 cmets 中的@Griffin 建议,我尝试在 7zip WIM 文件上使用 7zip LZMA2 压缩(字典大小似乎没有区别)。遗憾的是,这与我几年前在测试中使用的备份文件不同,但我可以将 WIM 文件压缩到其大小的 70%。我会使用您的特定文件集尝试使用这 2 步方法,并将其与方法 1 进行比较。

      新编辑:我的备份正在增长,现在有许多图像文件。对于 30 个版本的网站,方法 1 的权重为 6Gb,而 7zip LZMA2 文件中的 7zip WIM 文件仅重 2Gb!

      【讨论】:

      • 您的实体块大小也可能有所不同。
      • VIM 不压缩,它只是删除重复数据,如果您使用 LZMA2 压缩 vim 文件,我预计您最终可能会得到 20-40mb。因此,首先创建一个 vim 存档,然后压缩该 vim 存档。
      • @Griffin 不错的建议!我不知道为什么没有自动执行此操作的选项。将尝试并刷新答案;)
      【解决方案4】:

      重复的文件是否具有相同的名称?它们的大小通常小于 64 MB 吗?然后您应该按文件名(不包括路径)排序,使用tar 将所有文件按该顺序归档到.tar 文件中,然后使用xz 压缩以制作.tar.xz 压缩存档。 .tar 文件中相邻且小于所使用的xz 压缩级别的窗口大小的重复文件应压缩到几乎没有。您可以在this xz man page 中查看压缩级别的字典大小“DictSize”。它们的范围从 256 KB 到 64 MB。

      【讨论】:

      • 非常感谢!这帮助我将包含许多重复 html 文件(相同名称但不同目录)的 tar.gz 存档从 1 GB 缩小到 450 MB。
      • 从您的描述看来,压缩率应该比两倍好。
      • 抱歉,该存档的另一大部分来自较大的二进制文件(无重复)。我没有做任何进一步的调查,只是很高兴将数据缩小到一张 CD 上。干杯!
      • tar 可以处理硬链接,所以我会在 exec 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.
      【解决方案5】:

      WinRAR 默认情况下单独压缩每个文件。因此,默认情况下压缩包含许多相似甚至相同文件的文件夹结构并没有真正的好处。

      但也可以选择创建可靠存档。打开 WinRAR 的帮助并在 Contents 选项卡上打开 Archive types and parameters 项并单击 Solid archives。此帮助页面解释了什么是可靠存档以及这种存档文件格式有哪些优点和缺点。

      具有较大字典大小和最佳压缩的可靠存档可以使包含类似文件列表的存档文件非常小。例如,我有一个包含 327 个二进制文件的列表,文件大小从 22 KB 到 453 KB,总共 47 MB​​ 不包括分区的集群大小。我可以将这 327 个相似但不相同的文件压缩成一个 RAR 存档,其字典大小为 4 MB,只有 193 KB。这当然是尺寸的显着减小。

      在阅读关于solid archive 的帮助页面后,点击链接到关于rarfiles.lst 的帮助页面。它描述了如何控制将文件放入可靠存档的顺序。该文件位于 WinRAR 的程序文件夹中,当然可以根据您的需要进行定制。

      如果使用 WinRAR 的 GUI 版本,您还必须注意选项无需压缩即可存储的文件。在标签 Files 上单击符号/命令 Add 后可以找到此选项。有指定的文件类型,它们只是存储在存档中,没有任何压缩,如 *.png、*.jpg、*.zip、*.rar、... 这些文件通常已经包含压缩格式的数据,因此它不再次压缩它们很有意义。但是,如果文件夹结构中存在重复的 *.jpg 并且创建了可靠的存档,则从该选项中删除所有文件扩展名是有意义的。

      使用 WinRAR 的控制台版本 Rar.exe 并使用 RAR5 存档文件格式的合适命令行是:

      "%ProgramFiles%\WinRAR\Rar.exe a -@ -cfg- -ep1 -idq -m5 -ma5 -md128 -mt1 -r -s -tl -y -- "%UserProfile%\ArchiveFileName.rar" "%UserProfile%\FolderToArchive\"
      

      本例中用到的开关在Rar.exe的手册中有说明,它是WinRAR程序文件目录下的文本文件Rar.txt。也可以使用WinRAR.exe 将开关-idq 替换为-ibck,如WinRAR 页面上的字母开关列表 帮助中所述,通过最后一个菜单打开帮助单击第一个菜单项帮助主题并在第一个选项卡内容上展开列表项命令行模式和下一步子列表项 Switches 并单击第一项 Alphabetic Switches 列表

      顺便说一句:有像 Total CommanderUltraFinderUltraCompare 之类的应用程序以及许多其他支持按各种搜索重复文件的应用程序,用户可配置的标准,例如查找具有相同名称和相同大小或最安全的文件,查找具有相同大小和相同内容的文件,并提供删除重复项的功能。

      【讨论】:

        【解决方案6】:

        试试 www.exdupe.com 的 eXdupe,它使用重复数据删除,速度非常快,几乎是磁盘 I/O 限制

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多