Gzip

使用偏移量讀取部分下載的 gzip

  • August 9, 2021

假設有一個巨大**db.sql.gz**的 100GB 可用https://example.com/db/backups/db.sql.gz並且伺服器支持範圍請求

因此,我沒有下載整個文件,而是下載了**y帶有字節偏移量(比如說 1000 字節)的x**字節(比如說 1024 字節),如下所示。

curl -r 1000-2024 https://example.com/db/backups/db.sql.gz

使用上述命令,我能夠下載 gzip 文件的部分內容,現在我的問題是如何讀取該部分內容?

我試過gunzip -c db.sql.gz | dd ibs=1024 skip=0 count=1 > o.sql了,但這給出了一個錯誤

gzip:dbrange.sql.gz:不是 gzip 格式

該錯誤是可以接受的,因為我猜在文件的頂部可能有描述編碼的標題塊。


我注意到,如果我下載沒有偏移量的文件,我可以使用gunzip和管道讀取文件。

curl -r 0-2024 https://example.com/db/backups/db.sql.gz

gzip不生成塊壓縮文件(有關血腥細節,請參閱RFC),因此它本身不適合隨機訪問。您可以從流中開始讀取並隨時停止,這就是您的curl -r 0-2024範例有效的原因,但您不能在中間選擇流,除非您有一個補充文件來提供失去的數據(例如索引文件由gztool) 創建。

為了實現您想要做的事情,您需要使用某種塊壓縮;例如 bgzip(生成可以通過 plain 解壓縮的文件gzip)或bzip2, 並在接收端做一些工作來確定塊邊界的位置。Peter Cock 寫了一些關於這個主題的有趣文章:BGZF - 被封鎖、更大、更好的 GZIP!隨機訪問BZIP2?

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