從磁帶讀取文件大小
我有一盤磁帶,
.tar.lzma
裡面有存檔。如何按原樣確定存檔.tar.lzma
的大小?換句話說,我正在尋找壓縮存檔的大小,而不是它儲存的未壓縮文件的大小——理想情況下,無需將存檔從磁帶複製到磁碟並從那裡檢查。.tar
有問題的磁帶 (LTO-6)未使用任何特殊文件系統(例如 LTFS)進行格式化。
我的系統在 amd64 上使用 Debian 11 Bullseye,如果有必要提及的話。
.tar.lzma 實際上只是一個通過
lzma
壓縮器的 tar 文件,所以它內部是一個 tar 並不重要。因此,lzma-file-format.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-specification.txt指出
如果“Uncompressed size”欄位在所有64位中都包含1,則表示未壓縮大小未知,並且流中有“end marker”,表示解碼點的結束。
在相反的情況下,如果“未壓縮大小”欄位的值不等於 ((2^64) - 1),則必須在解碼指定字節數(未壓縮大小)後完成 LZMA 流解碼。如果存在“結束標記”,LZMA 解碼器也必須讀取該標記。
所以,LZMA 是一個流解碼器,它告訴你
您需要在生成 X 數據後停止解壓縮數據,或者如果 X 為 2⁶⁴-1,當我告訴您“停止”時停止
因此,除了解壓縮(丟棄解壓縮的數據)之外,沒有任何資訊可用於了解壓縮存檔的長度。
(順便說一句,我說
tar
的一個原因是存檔格式不好。如果壓縮是在存檔容器內完成的,而不是圍繞它進行壓縮,這將不是問題。但這就是您的數據,所以本質上什麼都沒有你可以做的…)