題 使用list參數估計壓縮文件大小


我目前正在以下列格式壓縮目錄中的文件列表:

tar -cvjf test_1.tar.gz -T test_1.lst --no-recursion

上面的命令將僅壓縮列表中提到的那些文件。我這樣做是因為生成此列表使其適合DVD。但是,在壓縮期間,壓縮率會降低估計的文件大小,並且DVD中剩餘的空間很大。這就像一個背包算法。

我想估計壓縮文件的大小,並在列表中添加更多文件。我發現可以使用以下命令估計文件大小:

tar -cjf - 文件夾/ | wc -c

此命令不採用列表參數。有沒有辦法估算壓縮文件的大小?我也在研究perl腳本等選項。

編輯:

我想我應該提供更多信息,因為我一直在進行大量的網絡搜索。我遇到了一個perl腳本(鏈接)那種模擬Knapsack算法。

上述腳本的當前問題是它將文件拆分為其原始狀態。當我分割它們後壓縮文件時,有機會添加更多我認為效率低下的文件。

有兩種方法可以解決效率低下問題:

a)壓縮單個文件並使用腳本將它們保存在目錄中。壓縮文件可以提供最佳估計。我可以使用壓縮文件的文件夾生成腳本,並在未壓縮的文件上使用它們。

b)檢查壓縮文件的大小是否小於所需大小。如果是這樣,我應該繼續添加文件,直到我滿足要求。但是,將新文件添加到壓縮文件本身就是一個優化問題。


3
2018-03-19 20:06


起源




答案:


編輯2:

我重新閱讀了你的問題,並找到了解釋它的新方法。使用類似的東西很容易在壓縮後找到文件的大小 bzip2 -k $file | wc -c 在每個文件上。但是,這並不能解決您的問題,因為您對每個壓縮文件的大小不感興趣,而是包含所有文件的tarball的壓縮大小(如果添加特定文件,它會增加多少)。與壓縮的大小差異不是 線性 但事實上相當不可預測,所以這個是第二個的不良預測因素。

一個例子是10個MiB的兩個相同文件,其中兩個都單獨壓縮到1 MiB,並且包含兩者的壓縮包也壓縮到1 MiB。

原始答案

我相信通常的解決方案,如果只是拆分壓縮數據 split,這意味著如果要從任何文件中恢復文件,則需要所有可用的結果磁盤。我認為 tar 有一個內置的拆分機制,但它只適用於未壓縮數據的數量,這會導致壓縮和非同類文件的結果很差。

如果您可以進行人工干預並且可能已經足夠,則可以採用不同的解決方案(遠非完美)。如果您的文件與所需的捲大小相比較,則效果最佳

我帶你一個目標體積大小,在MiB。在示例中,我使用700 MiB。

如果你跑

tout="/tmp/09b00c50a9625deeb1089b3c4358c5e5" #or something else
csize="7" # in MiB
mkfifo "$tout"
tar -cvj ~/ 2>"$tout" | dd bs=1M count="$csize" of=/dev/null iflag=fullblock 2>/dev/null &
tail -20 "$tout" | xargs -n 1 ls -ld
rm "$tout"

tar 將打印出它試圖壓縮到管道的所有文件,直到dd收到700 MiB的壓縮數據。 tail 讀取最後20個文件 tar 試圖從fifo壓縮。

打印的最後一個文件(至少)將無法滿足您的捲大小。由於兩者都有緩存 tar 和 bzip2但是,其他幾個文件可能也不適合,所以你可能需要嘗試一下你跳過多少個文件。如果所有文件都非常小,您可能需要告訴 tail 打印出20多個,看看那個讓你超過極限的那個。

編輯:

您甚至可以直接將文件名寫入文件列表(使用合適的過濾器刪除目錄),然後只刪除文本編輯器中的最後幾行。


1
2018-03-19 21:07



我在帖子的編輯中提供了更多信息。我期待著聽到你的想法 - Sai