我有一盘磁带,.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
归档格式不好的原因之一。如果压缩是在归档容器内完成的,而不是在其周围完成,那么这不会成为问题。但这就是您的数据的样子,因此本质上没有任何问题你可以做点什么...)