2013-06-05 164 views

回答

0

這不可能與.tar.gz,這就是爲什麼。

爲了創建.tar.gz文件,你必須要tar它首先創建單個文件.tar,然後gzip的結果。

.tar文件可以在不讀取整個文件的情況下對其進行掃描,但只有當tar存檔的成員相對較大時才能正常運行。這是因爲tar沒有任何標題,其中列出了所有成員在一個緊湊的地方。每個檔案成員都有512字節的描述符,比顯示下一個描述符的位置。使用大檔案成員,您可以在磁盤上相對快速地找到任意成員內容,但您必須多次訪問lseek()

但是,一旦您在.tar之上應用gzip,基本上無法快速獲取存檔的所有成員的列表,更不用說實際獲得其內容的未壓縮。你不得不解壓縮整個檔案,甚至只是獲得其所有成員的名單。

請注意,流行的.tar.bz2.tar.xz格式存在完全相同的問題。

您可以使用zip格式來修復它。 zip.tar.gz相比具有很大優勢,因爲它具有可在一個位置列出所有存檔成員的緊湊索引,並且它允許快速讀取該列表並僅提取所需的文件,而無需提取(gunzip).tar.gz所遭受的整個存檔。

+0

好了,所以可以使用一些bash的福,有些子魔我本事? –

+0

你仍然需要足夠大的空間來保存原始'.tar.gz'的未壓縮內容。如果你有很多的內存,並且這個檔案不是很大(未壓縮),它可以*存儲在'/ tmp'中作爲'tmpfs'掛載(在內存中有效!) – mvp

0

我找到了解決方案。我只是給它在這裏以供參考:

import subprocess 
file_name = /var/log/2013-06-10.tar.gz 
gzip_data = subprocess.Popen(["tar", "-Oxf", file_name], stdout=subprocess.PIPE) 
data = subprocess.Popen(["zcat"], stdin=gzip_data.stdout, stdout=subprocess.PIPE) 
for line in data.stdout: 
    do_my_process_on(line)