在不存储压缩文件的情况下估计目录可以达到的压缩级别的最佳方法是什么?
我有大量目录和子目录,其中包含不同性质的文件(二进制文件、文本文件、压缩文件等)。我需要压缩其中一些目录,但我没有足够的空间来压缩所有目录(甚至其中一些目录),并且它们按压缩率对它们进行排序。
因此,我需要列出它们的压缩率(可以压缩多少),然后才能决定要压缩的压缩率。
我有一个未压缩目录的目录大小列表:
du -f --maxdepth=3 > /tmp/list_of_directories
Tar、bz2 或 gzip 可用于使用快速压缩级别将每个目录压缩到空管道,但如果不保留文件,则不会生成压缩率统计数据。
由于整个内容必须以某种方式压缩到压缩管道中,因此该解决方案的处理强度非常大,但在存储方面却非常轻,因为压缩结果在生成时将被丢弃。
简而言之,问题可以恢复为“是否有任何工具可以生成给定流、文件或目录的压缩率统计信息,而不存储最终的压缩文件?”
答案1
可以通过将目录的内容通过管道传输到压缩工具并将压缩流重定向到空管道(以避免使用空间)来完成。该压缩工具必须: 1 - 压缩到管道流 2 - 能够压缩到 /dev/null 2 - 提供废弃文件的压缩统计信息
在最流行的工具中,bzip2 是最适合的工具,特别是由于输入和输出字节数的输出状态。
最终的解决方案如下所示:
猫 $(查找 DIRECTORY_PATH) | bzip2 -c --verbose > /dev/null
第一部分将连接所选目录中任何文件的所有内容。
猫$(查找DIRECTORY_PATH)
第二部分将压缩第一部分的串联输入,并在最后生成单个报告(--verbose),同时将输出重定向到空管道
bzip2 -c --verbose > /dev/null
输出应如下所示,其中“(\d+) in”正则表达式应捕获字节目录中所有文件的原始大小,“(\d+) in”则捕获压缩大小(以字节为单位)。输出应如下所示:
1.581:1,5.059 位/字节,节省 36.77%,1039062 输入,657029 输出。
该解决方案对目录上的文件数量有限制,但可以用作识别具有良好压缩潜力以节省空间的目录的良好起点。