Linux

從磁帶讀取文件大小

  • April 9, 2022

我有一盤磁帶,.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的一個原因是存檔格式不好。如果壓縮是在存檔容器內完成的,而不是圍繞它進行壓縮,這將不是問題。但這就是您的數據,所以本質上什麼都沒有你可以做的…)

引用自:https://unix.stackexchange.com/questions/698589