从磁带读取文件大小

从磁带读取文件大小

我有一盘磁带,.tar.lzma上面写有存档。如何确定.tar.lzma存档的大小按原样?换句话说,我正在寻找压缩档案的大小,不是它所存储的未压缩文件的大小.tar- 理想情况下无需将存档从磁带复制到磁盘并从那里进行检查。

有问题的磁带 (LTO-6) 是不是使用任何特殊文件系统(例如 LTFS)进行格式化。

我的系统在 amd64 上使用 Debian 11 Bullseye,如果与此相关的话请提及。

答案1

.tar.lzma 实际上只是一个通过lzma压缩器传递的 tar 文件,因此它内部是否是 tar 并不重要。

所以,lzma 文件格式.txt包含解析该文件格式所需的所有信息;它以一个令人惊讶的简单标题开始:

1. File Format

        +-+-+-+-+-+-+-+-+-+-+-+-+-+==========================+
        |         Header          |   LZMA Compressed Data   |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+==========================+

        The .lzma format file consist of 13-byte Header followed by
        the LZMA Compressed Data.

……

1.1.标头

    +------------+----+----+----+----+--+--+--+--+--+--+--+--+
    | Properties |  Dictionary Size  |   Uncompressed Size   |
    +------------+----+----+----+----+--+--+--+--+--+--+--+--+

(每个+---+为一个字节,备注)

所以,这里没有压缩尺寸信息!

你猜猜这是怎么回事。https://github.com/jljusten/LZMA-SDK/blob/master/DOC/lzma-specation.txt指出

如果“未压缩大小”字段全部包含 64 位,则意味着未压缩大小未知,并且流中存在“结束标记”,指示解码点的结束。

相反的情况下,如果“Uncompressed size”字段的值不等于((2^64) - 1),则LZMA流解码必须在解码指定字节数(Uncompressed size)后完成。如果存在“结束标记”,LZMA 解码器也必须读取该标记。

所以,LZMA 是一个流解码器,它告诉你

你需要在生成X个数据后停止解压数据,或者如果X是2⁶⁴-1,当我告诉你“停止”时停止

因此,除了解压缩(丢弃解压缩的数据)之外,没有任何信息可以用来了解压缩存档的长度。

(顺便说一句,这就是我说的tar归档格式不好的原因之一。如果压缩是在归档容器内完成的,而不是在其周围完成,那么这不会成为问题。但这就是您的数据的样子,因此本质上没有任何问题你可以做点什么...)

相关内容