題 從巨大的tgz文件中提取單個文件


我有一個巨大的tar文件(約500G),我不想從中提取一個文件。
但是,當我跑 tar -xvf file.tgz path/to/file 它似乎仍然將整個內容加載到內存中,並且需要一個多小時才能提取。 我也試過用 --exclude=ignore.txt 其中ignore.txt是試圖阻止它遍歷無用路徑的模式列表,但這似乎不起作用。

也許我不明白tar ...有沒有辦法快速提取文件?


13
2017-10-08 00:28


起源


我想知道同樣的事情。我正在尋找的文件被快速找到並提取 - 然後我需要等待一小時才能處理其餘的成就:o( - maasha


答案:


不幸的是,為了解包單個成員 .tar.gz 存檔您必須處理整個存檔,並且您無法解決它。

這是哪裡 .zip (以及其他一些格式 .rar)檔案工作要好得多,因為 zip format具有包含在其中的所有文件的中心目錄,其中直接偏移指向中間 zip 文件,因此可以快速提取存檔成員而無需處理整個事情。

您可能會問為什麼要處理 .tar.gz 太慢了?

.tar.gz (通常縮短為 .tgz)很簡單 .tar 壓縮歸檔 gzip 壓縮機。 gzip 是流式壓縮器,只能使用一個文件。如果你想獲得任何一部分 gzip 流,你必須將它作為一個整體解壓縮,這就是真正殺死它的東西 .tar.gz (並為 .tar.bz2.tar.xz 以及基於的其他類似格式 .tar)。

.tar 格式實際上非常非常簡單。它只是512字節文件或目錄標題(名稱,大小等)的流,每個文件或目錄標題後跟文件或目錄內容(如果需要,填充到512塊大小,0字節)。當您為標題觀察到完全為空512塊時,這意味著結束 .tar 存檔。

有些人甚至認為 .tar 存檔成員無法快速訪問,但事實並非如此 相當 真正。如果 .tar archive包含很少的大文件,你實際上可以快速搜索到下一個標題,因此你可以在很少的搜索中找到必要的檔案成員(但仍然需要盡可能多的搜索和存檔成員)。如果你的 .tar 存檔包含許多小文件,這意味著即使對於未壓縮的文件,快速成員檢索也變得不可能 .tar


10
2017-10-08 04:18



gzip可以傳輸未壓縮的數據,它不必撤消整個事情。但是,由於.tar是磁帶歸檔的縮寫,因此您需要遍歷整個文件,直到找到要查找的文件。雖然tar會繼續查找,因為稍後可能會在tar文件中有另一個稍後的副本。 - kurtm


如果您只從大型tar文件中提取一個文件,那麼您正在使用GNU tar並且您可以保證從未附加過tar文件 那麼你可以通過使用來獲得顯著的性能提升 --occurrence

此選項告訴tar一旦找到您請求的每個文件的第一次出現就停止,例如,

tar xf large-backup.tar --occurrence etc/passwd etc/shadow

在找到每個tarball的一個副本後,它不會繞過整個tarball passwd 和 shadow相反它會停止。如果這些文件出現在最後,性能增益不會太大,但如果它們甚至出現在500G文件的一半,你將節省大量時間。

適合人們使用 tar 對於單次備份而不使用真正的磁帶驅動器,這種情況可能是典型的情況。

請注意,您也可以通過 --occurrence=NUMBER 檢索每個文件的第NUMBER次出現,這有助於你知道那裡  存檔中有多個版本。默認情況下,行為等於a NUMBER 1。


4
2018-04-19 19:30





遺憾的是,tar文件格式不包含集中的目錄 - 因此必須按順序讀取存檔以查找特定文件。它最初是為磁帶備份而設計的(“tar”來自 ŤAR韭菜),在任何情況下都不支持這樣的操作。

所以,你可能只需要等待。


1
2017-10-08 00:34





這是我的2cents:

gunzip < remix-v2.0-20170105-pine64-64GB.img.gz > remix-v2.0-20170105-pine64-64GB.img
gunzip < Bliss-pine64_a64+_20170919.img.gz > Bliss-pine64_a64+_20170919.img

你仍然會得到 gzip: stdout: File too large 在命令行上但是 img 會正確提取....


0
2018-04-02 13:00





處理大型tarball時使用:

--fast-read 僅提取與文件名操作數匹配的第一個歸檔條目, path/to/file 在這種情況下 - 無論如何在tarball中總是獨一無二的

tar -xvf file.tgz --fast-read path/to/file

以上將搜索,直到找到匹配然後退出


0
2017-07-13 07:42