題 使用tar -zcvf時如何指定壓縮級別?


我經常在工作中gzip目錄。我通常做的是

tar -zcvf file.tar.gz /path/to/directory

有沒有辦法在這裡指定壓縮級別?我想盡可能使用最佳壓縮,即使壓縮需要更多時間。


125
2017-07-01 18:00


起源




答案:


GZIP=-9 tar cvzf file.tar.gz /path/to/directory

假設你正在使用bash。通常,將GZIP環境變量設置為“-9”,並正常運行tar。

另外 - 如果你真的想要最好的壓縮,不要使用gzip。使用lzma或7z。

當使用gzip時(考慮到各種原因這是個好主意)考慮使用 pigz 程序而不是 gzip


124
2017-07-01 18:38



pigz是“parallel gzip”,它使用你所有的內核進行gzip壓縮。你可以看 top 並使用200%-400美元CPU之間的任何地方看到它。 - Felipe Alvarez
僅供參考。對於.bz2格式,使用:BZIP2 = -9 tar cvjf file.tar.bz2 / path / to / directory - Tomofumi
環境變量現在似乎是 GZIP_OPT,用法應該是一樣的。 - Seer
從Ubuntu 16.04上的手冊頁獲取gzip:“在Vax / VMS上,環境變量的名稱是GZIP_OPT,以避免與用於調用程序的符號集衝突。”對於sh,csh和MSDOS,它應該仍然只是GZIP - Ponyboy47


而不是使用tar的gzip標誌,在tar進程之後手動gzip文件,然後你可以指定gzip程序的壓縮級別:

tar -cvf files.tar /path/to/file0 /path/to/file1 ; gzip -9 files.tar

或者您可以使用:

tar cvf - /path/to/file0 /path/to/file1 | gzip -9 - > files.tar.gz

gzip命令行中的-9告訴gzip使用最大可能的壓縮級別(默認為-6)。

編輯: 基於@depesz註釋的固定管道命令行。


62
2017-07-01 18:25



使用管道應該使用: tar cvf - /path/to/directory | gzip -9 - > file.tar.gz
第一個例子應該結束 file.tar從那以後 gzip 添加“.gz”擴展名。 - bonsaiviking
你為什麼不跳過 f -?如果沒有文件,那麼它是stdin / out - akostadinov
除了普遍的評論。從“man tar”部分Environtment:TAPE如果未指定--file,則用於存檔的設備或文件。如果未設置此環境變量,請改用stdin或stdout。 - Mikl
我們可以減少“gzip -9 - ” - >“gzip -9”。從“man gzip”部分描述:如果未指定文件,或者文件名為“ - ”,則標準輸入將壓縮為標準輸出。 - Mikl


現代版本的tar支持xz歸檔格式(GNU tar, 從1.22開始 在2009年,Busybox 從1.17.0開始 在2010年)。

它基於 LZMA2,有點像 的7-Zip 的版本 GZ。如果你需要xz支持,這可以提供更好的壓縮。

tar -Jcvf file.tar.xz /path/to/directory

我剛剛發現 這裡 (基本上是這個問題的重複,但在Unix stackexchange中)還有一個XZ_OPT = -9環境變量來控制XZ壓縮級別,類似於另一篇文章中的GZIP壓縮級別。

XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory

44
2017-12-19 03:03



+1 xz遠比bzip2和gzip都好。這是一個比較: tukaani.org/lzma/benchmarks.html - User1
權衡是速度。 XZ是 顯著 慢點。 - Bell


tar cv /path/to/directory | gzip --best > file.tar.gz

這是Matrix Mole的第二個解決方案,但略有縮短:

調用tar時,選項 f 聲明輸出是一個文件。將其設置為 - (stdout)使tar將其輸出寫入stdout,這是沒有兩者的默認行為 f 和 -

正如所述 gzip 手冊頁,如果沒有指定文件,gzip將從標準輸入壓縮。沒有必要 - 在裡面 gzip 呼叫。

選項 --best (相當於 -9)設置最高壓縮級別。


28
2018-02-04 18:17



這很好用。此外,如果您以root身份運行,也會保留權限和所有者。否則你必須指定。此外,如果不明顯“-9”是最好的壓縮,“ - 1”是最快的壓縮。如果你有很多文件,“-1”仍然需要一段時間;-) - PJ Brunet
這適用於 xz 和 pixz 太。這是一種很好的方法來控制用於並行壓縮的線程數,而無需創建中間.tar文件。像這樣 tar -cv /path/to/dir | pixz -p4 > output.tpxz - joelostblom


還可以使用-I指定壓縮程序。這可以包括壓縮級別選項。

tar -I 'gzip -9' -cvf file.tar.gz /path/to/directory

10
2018-06-21 04:21



較舊版本的tar(如CentOS 6和7中提供的版本)不支持提供參數 -I arg,他們會嘗試將整個事物視為exec的程序名稱,從而失敗。至少從Debian Stretch中的tar 1.29開始,這確實有效。 - Cheetah