2010-06-25 46 views
2

其實我很痛苦恢復損壞的GZIP文件,可能是由於中斷的FTP傳輸,然後恢復。谷歌搜索後,我發現Recovering a damaged .gz file,並試圖閱讀。有效的方式來合併頭文件和尾部文件的一部分,然後到標準輸出

我現在正在做的是合併一個gzip頭文件和損壞文件的最後部分,改變最後一部分的大小。然後,如果它能產生有意義的結果,我將測試合併的文件作爲gunzip輸入。我寫了一個腳本,以下是我可以將合併重定向到gunzip的最佳方式。什麼是更有效的方式將文件內容重定向到gzip?我想你不應該創建任何文件。 ($ i是大小可變)

cat head > x.gz; tail -c $i tail >> x.gz; gzip -t x.gz 2>&1 1>/dev/null 

回答

1

相同,但沒有一個臨時文件:

for ((i=0; i<$TAIL_FILE_SIZE; $i++)); do 
    (cat head; tail -c $i tail) | gzip -t &>/dev/null && { echo "TEST OK: $i"; break; } 
done 

()創建子shell。它的輸出送到gzip -t,它會從標準輸入讀取,如果它不是終端。沒有臨時文件 - 所有數據都在管道中。

在你的情況下,我認爲tail -c應該沒問題。許多GNU工具(包含尾部)在幫助優化方面有相當多的性能。例如。在我的SUSE中,tail -c使用mmap()來訪問輸入文件。

否則爲了讀取偏移量爲1的文件通常使用dd

P.S.在Perl中,您可以將頭文件和尾文件讀入內存,然後使用substr()嘗試將代碼片段從CPAN饋送到某個gzip庫。 (我很確定有Perl的gzip庫 - 但我沒有使用它,Google立即顯示幾個命中)。通過這種方式,您可以通過刪除啓動進程和重新讀取文件來進一步降低開銷。

+0

爲了提高效率,我可以忽略gzip的所有輸出,但由於我正在處理破損的文件,所以總是會導致錯誤。我測試錯誤消息尋求「crc」。除此之外,它看起來不錯。謝謝。 – DylanYi 2010-06-25 15:58:18

0

這是你的命令的修正版本:

cp head x.gz; tail -c $i tail >> x.gz; gzip -t x.gz >/dev/null 2>&1 

通過重定向所有輸出到/dev/null然後你在的gzip的退出代碼僅僅依靠的完整性測試的結果,因爲沒有消息會打印到終端。請注意,重定向的順序很重要。

如果你不希望創建一箇中間文件:

cat head <(tail -c $i tail) | gzip -t >/dev/null 2>&1 

它看起來像你的腳本前,你創建的文件被稱爲「頭」和「尾」。這可能會有所不同,並且整體上具有更高的效率。

相關問題