【问题标题】:Check the total content size of a tar gz file检查 tar gz 文件的总内容大小
【发布时间】:2011-02-12 07:41:30
【问题描述】:

如何从命令行提取 .tar.gz 文件中的总未压缩文件数据的大小?

【问题讨论】:

  • 来自 shell 脚本,使用 Java、C、C++、C#,什么?
  • 抱歉不清楚,我的意思是通过命令行shell。

标签: gzip tar


【解决方案1】:

这适用于任何文件大小:

zcat archive.tar.gz | wc -c

对于小于 4Gb 的文件,您还可以将 -l 选项与 gzip 一起使用:

$ gzip -l compressed.tar.gz
     compressed        uncompressed  ratio uncompressed_name
            132               10240  99.1% compressed.tar

【讨论】:

  • 这给了我 tar 文件的大小,包括文件元数据,如文件名等。我正在寻找一种只检查文件总大小的方法。无论如何,这样做的唯一方法似乎是提取 tar 文件并在提取的内容上运行脚本。
  • 其实这样就够了。您还需要文件夹 inode 的空间,这可能因不同的文件系统而异。 tar -tf... 计算实际大小将在完整文件上运行 gzip -d,因此您将实际提取 tar。这里所说的gzip -l不会解压,所以还是挺快的。
  • 在我的例子中,这给了我一个小于压缩和负比率的解压缩大小。
  • 值得注意的是,报告的未压缩大小是模 2^32,这意味着这不适用于大于 4GB 的文件。请改用此命令:zcat archive.tar.gz | wc -c
  • 谢谢@nedned。我想知道为什么一个充满文本数据文件的 2.9Gb tar.gz 报告的压缩率为 -36% o_O。这似乎是一个愚蠢的错误。
【解决方案2】:

这将汇总提取文件的总内容大小:

$ tar tzvf archive.tar.gz | sed 's/ \+/ /g' | cut -f3 -d' ' | sed '2,$s/^/+ /' | paste -sd' ' | bc

输出以字节为单位。

解释:tar tzvf 以详细格式列出存档中的文件,例如ls -lsedcut 隔离文件大小字段。第二个sed 在除第一个之外的所有大小前面加上一个+,paste 将它们连接起来,给出一个求和表达式,然后由bc 计算。

请注意,这不包括元数据,因此当您提取文件时,文件占用的磁盘空间会更大 - 如果您有很多非常小的文件,可能会大很多倍。

【讨论】:

  • 或者更简洁一点:tar tzvf archive.tar.gz | awk '{s+=$3} END{print (s/1024/1024), MB}'.
  • 谢谢,鲁本斯。这是完美而简单的。我为我做了这个,效果很好:tar tzvf 20180731.tar.gz | awk '{s+=$3} END{打印(s/1024/1024/1024)“GB”}'。我确实必须在“MB”或“GB”周围加上引号才能打印出来。
  • 计算顶级目录(和文件)大小:tar tzvf /tmp/root.tgz| sed 's/ \+/ /g' |剪切 -f3,6- -d' ' |剪切-f1 -d'/' | awk '{ arr[$2]+=$1 } END { for (key in arr) printf("%s\t%s\n", key, arr[key]) }'
  • 我看到 0,0 的尺寸会破坏管道。添加额外的 sed 's/./,/g' 会有所帮助。这个用点代替逗号,然后总结就可以了
【解决方案3】:

命令gzip -l archive.tar.gz 不能正确处理大于 2Gb 的文件。对于非常大的文件,我会推荐 zcat archive.tar.gz | wc --bytes

【讨论】:

  • 我相信gzip -l 不适用于大于 4GB 的文件,因为 gzip 仅使用 4 个字节来存储原始文件大小。
  • 在查看 gzip.c 的源代码时,它似乎是一个 off_t,它是一个有符号的 4 字节值,因此最大值为 2GB。
  • gzip 规范 (ietf.org/rfc/rfc1952.txt) 说 ISIZE 字段应该是原始文件大小模 2^32,不知道为什么 gzip 使用带符号的 int...
【解决方案4】:

我知道这是一个旧答案;但两年前我为此编写了一个工具。它被称为gzsize,它为您提供了 gzip 文件的未压缩大小,而无需实际解压缩磁盘上的整个文件:

$ gzsize <your file>

【讨论】:

  • wc 的管道相比,它有什么改进?我认为管道也可以即时工作。
  • @mxmlnkn 至少快两倍,有时甚至更快。在两个具有不同压缩级别的样本 12GB 文件(一个包含随机数据 - 11GB 压缩;一个包含重复数据 - 18MB 压缩)zcat|wc -l 需要 60 秒和 42 秒,而gzsize 需要 29 秒和 15 秒。
【解决方案5】:

使用以下命令:

tar -xzf archive.tar.gz --to-stdout|wc -c

【讨论】:

    【解决方案6】:

    我在网上找到所有网站,当文件大小大于 4GB 时,无法解决这个问题。

    首先,哪个最快?

    [oracle@base tmp]$ time zcat oracle.20180303.030001.dmp.tar.gz |厕所-c 6667028480 真正的 0m45.761s 用户 0m43.203s 系统 0m5.185s [oracle@base tmp]$ time gzip -dc oracle.20180303.030001.dmp.tar.gz |厕所-c 6667028480 真正的 0m45.335s 用户 0m42.781s 系统 0m5.153s [oracle@base tmp]$ time tar -tvf oracle.20180303.030001.dmp.tar.gz -rw-r--r-- oracle/oinstall 111828 2018-03-03 03:05 oracle.20180303.030001.log -rw-r----- oracle/oinstall 6666911744 2018-03-03 03:05 oracle.20180303.030001.dmp 真正的 0m46.669s 用户 0m44.347s 系统 0m4.981s

    当然,tar -xvf 是最快的,但是 ¿get header 后如何取消执行?

    我的解决方案是这样的

    [oracle@base tmp]$ time echo $(timeout --signal=SIGINT 1s tar -tvf oracle.20180303.030001.dmp.tar.gz | awk '{print $3}') | grep -o '[[:digit:]]*' | awk '{ 总和 += $1 } END { 打印总和 }' 6667023572 真正的 0m1.005s 用户 0m0.013s 系统 0m0.066s

    【讨论】:

    • 标题?您的解决方案取决于文件大小和文件数量。尝试对存档中的大量文件而不是 2 个文件进行尝试。对越来越大的 tar.gz 文件进行尝试。
    【解决方案7】:

    解压缩 tar 文件,直到/除非它通过其他程序过滤,例如 gzip、bzip2、lzip、compress、lzma 等。tar 文件的文件大小与提取的文件相同,可能更少添加了超过 1kb 的标头信息以使其成为有效的 tarball。

    【讨论】:

    • tarball 中的每个文件都有一个 512 字节的标头,加上内部文件被填充为 512 字节的倍数。这增加了 tarball 中每个文件 768 字节的平均开销。
    • tarball 的关键在于它们是较小的版本,用于传输,就像 zip 文件一样。
    • @Nathan 不,不是。相反,它被设计为具有更大的数据块作为普通文件系统。 TAR 代表磁带存档,现在已重新调整用途,但仍然是用于更大数据块的存档文件。并且与传输无关,实际上在设计调制解调器时进行了压缩。您可以像 gzip 任何其他文件一样 gzip TAR。汤姆的答案将给出非常无用的大小近似值,但它与您从“gzip -l”答案中获得的方法和大小相同,而汤姆得到了反对票,而那些有 66 票和 27 票?不公平。
    • @papo 我原来的评论措辞不佳,但答案仍然是错误的。 tar.gz 文件的大小不一样,这就是 OP 所要求的。我写了“tarball”,但意思是“tar gz 文件”。汤姆并没有真正给出答案,只是一些关于未压缩 tarball 的信息,这不是 OP 所要求的。这可能是投反对票的原因。你不能只回答“我该怎么做?”带有“您不需要”答案的问题,除非他或她在问题中说明,否则我们不知道 OP 需要什么。
    • @papo 似乎 Tom S 知道这个答案可能会以红色告终。 CYA alt 帐户?单一活动帐户对于问题很常见,但对于答案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多