Linux基礎命令---bzip2

一生有你llx發表於2018-12-13

bzip2

使用Burrows-Wheeler塊排序文字壓縮演算法,將檔案進行壓縮,壓縮比率比一般演算法高一些。bzip2要求命令列標誌附帶一個檔名列表。每個檔案都被自己的壓縮版本替換,名稱為“original_name.bz2”。每個壓縮檔案與相應的原始檔案具有相同的修改日期、許可權和所有權(如果可能的話),因此可以在解壓縮時正確地還原這些屬性。

預設情況下,bzip2和bunzip2不會覆蓋現有檔案。如果希望發生這種情況,請指定“-f”標誌。如果沒有指定檔名,bzip2將從標準輸入壓縮到標準輸出。在這種情況下,bzip2拒絕將壓縮輸出寫入終端,因為這將是完全不可理解的,因此毫無意義。

bunzip2( 或bzip2 -d)解壓縮所有指定的檔案。未由bzip2建立的檔案將被檢測和忽略,併發出警告。bzip2試圖從壓縮檔案中猜測解壓縮檔案的檔名,如下所示:

filename.bz2    becomes  filename

filename.bz     becomes  filename

filename.tbz2   becomes  filename.tar

filename.tbz    becomes  filename.tar

anyothername    becomes  anyothername.out

如果檔案沒有以.bz2、.bz、.tbz2或.tbz中的某個結尾,bzip2抱怨它無法猜測原始檔案的名稱,並使用原始名稱並附加.out。與壓縮一樣,不提供檔名會導致從標準輸入到標準輸出的解壓縮。bunzip2將正確解壓縮一個檔案,該檔案是兩個或多個壓縮檔案的級聯。其結果是連線相應的未壓縮檔案。還支援連線壓縮檔案的完整性測試(-t)。

還可以通過賦予“-c”標誌將檔案壓縮或解壓縮到標準輸出。可以像這樣壓縮和解壓縮多個檔案。結果輸出按順序輸入到stdout。以這種方式壓縮多個檔案會生成包含多個壓縮檔案表示的流。這樣的流只能通過bzip2版本0.9.0或更高版本正確地解壓縮。在解壓縮流中的第一個檔案後,bzip2的早期版本將停止。

bzcat( 或bzip2 -dc)將所有指定的檔案解壓到標準輸出。bzip2將按照這個順序從環境變數BZIP2和BZIP讀取引數,並在從命令列讀取任何引數之前對它們進行處理。這為提供預設引數提供了一種方便的方法。

壓縮總是被執行,即使壓縮檔案比原始檔案稍大。小於100個位元組的檔案往往會變大,因為壓縮機制在50個位元組的範圍內有一個恆定的開銷。隨機資料(包括大多數檔案壓縮器的輸出)編碼大約為每位元組8.05位,擴充套件幅度約為0.5%。

bzip2 使用32位crc來確保解壓縮版本的檔案與原始檔案相同。這可以防止壓縮資料的損壞,防止bzip2中未被檢測到的bug(希望非常不可能)。資料損壞的可能性是微乎其微的,大約每處理40億個檔案就有一個機會。但是,請注意,檢查是在解壓時發生的,因此它只能告訴您某些事情是錯誤的。它無法幫助您恢復原始未壓縮資料。您可以使用bzip2recover嘗試從損壞的檔案中恢復資料。

返回值:0表示正常退出,1表示環境問題(檔案未找到,無效標誌,I/O錯誤,&c),2表示損壞的壓縮檔案,3表示內部一致性錯誤(例如,bug),導致bzip2恐慌。

此命令的適用範圍:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。

 

1 、語法

bzip2 [ -cdfkqstvzVL123456789 ]  [ filenames ...  ]

 

2 、選項列表

選項

說明

-h | --help

幫助資訊

-V | --version

顯示命令版本資訊

-c | --stdout

將解壓或者解壓檔案寫到標準輸出

-d | --decompress 

解壓

--z | -compress

對-d的補充:強制壓縮,而不管呼叫名稱如何

-t | --test

檢查指定檔案的完整性,但不要解壓縮它們。這確實執行了一次嘗試解壓縮,並丟棄了結果。

-f | --force

強制執行

-k | --keep

解壓之後,保留原始檔

-s | --small

減少記憶體使用,用於壓縮、解壓縮和測試。使用修改的演算法對檔案進行解壓縮和測試,該演算法每個塊位元組只需要2.5位元組。這意味著任何檔案都可以在2300 k記憶體中解壓縮,儘管速度是正常速度的一半。

在壓縮期間,-s選擇200 k的塊大小,這將記憶體的使用限制在大約相同的數字上,而代價是壓縮比。簡而言之,如果你的機器記憶體不足(8兆位元組或更少),那就用-s來做所有的事情。請參閱下面的記憶體管理。

-L | --license | -V | --version

列出gzip的許可證

-q | --quite

跳過所有的警告資訊

-v | --verbose

顯示詳細執行過程

-1 ~-9

指定壓縮比率,將塊大小設為100k,200k,900K。解壓時無效,“-1”等價於“--fast”,“-9”等價於“--best“。

-v | --verbose

顯示執行過程

--

將所有後續引數視為檔名,即使它們以‘-’開頭。這樣您就可以處理以‘-’開頭的檔案,例如:“ bzip2  --  -myfilename ”。

--repetitive-fast

--repetitive-best

這些標誌在0.9.5及以上版本中是多餘的。它們對早期版本中排序演算法的行為提供了一些粗略的控制,這有時是有用的。0.9.5及以上版本的改進演算法使這些標誌不相關

 

3 、記憶體管理

bzip2 以塊壓縮大型檔案。塊大小既影響壓縮比,也影響壓縮和解壓縮所需的記憶體量。標誌-1到-9指定塊大小分別為100000位元組至900000位元組(預設值)。解壓縮時,從壓縮檔案的頭讀取用於壓縮的塊大小,然後為其分配足夠的記憶體來解壓縮檔案。由於塊大小儲存在壓縮檔案中,因此在解壓縮過程中,標誌-1至-9與此無關,因而被忽略。壓縮和解壓縮需求(以位元組為單位)可估計為

Compression:   400k + ( 8 x block size )

Decompression: 100k + ( 4 x block size ), or 100k + ( 2.5 x block size )

更大的區塊大小給出迅速遞減的邊際回報。大部分壓縮來自塊大小的前兩三百k,在小型機器上使用bzip 2時要記住這一點。同樣重要的是要認識到,解壓縮記憶體需求是通過選擇塊大小在壓縮時間設定的。

對於預設的900k塊大小壓縮的檔案,bunzip2需要大約3700千位元組來解壓縮。為了支援對4MB機器上的任何檔案進行解壓縮,bunzip2可以選擇使用大約一半的記憶體(約2300千位元組)來解壓縮。解壓縮速度也減半,因此您應該只在必要時使用此選項。相關的標誌是-s。通常,嘗試並使用允許的最大塊大小的記憶體約束,因為這樣可以最大限度地實現壓縮。壓縮和解壓縮速度幾乎不受塊大小的影響。

另一個要點適用於適合單個塊的檔案,意味著大多數使用大塊大小的檔案。接觸到的實際記憶體量與檔案大小成正比,因為檔案小於塊。例如,使用標誌-9壓縮一個檔案的長度為20000位元組,將導致壓縮器分配大約7600k的記憶體,但只會觸及400k+20000*8=56萬位元組的記憶體。類似地,解壓縮程式將分配3700k,但只會觸及100k+20000*4=180 k位元組。

下面是一個表,它總結了不同塊大小的最大記憶體使用量

Compress     Decompress       Decompress       Corpus

Flag             usage      usage       -s usage     Size

-1               1200k       500k         350k      914704

-2               2000k       900k         600k      877703

-3               2800k      1300k         850k      860338

-4               3600k      1700k        1100k      846899

-5               4400k      2100k        1350k      845160

-6               5200k      2500k        1600k     838626

-7               6100k      2900k        1850k      834096

-8               6800k      3300k        2100k      828642

-9               7600k      3700k        2350k      828642

 

4 、從損壞的檔案中恢復資料

bzip2 以塊的形式壓縮檔案,通常長達900千位元組。每個塊都是獨立處理的。如果媒體或傳輸錯誤導致multi-block .bz2檔案損壞,則可以從檔案中未損壞的塊恢復資料。每個塊的壓縮表示由一個48位模式分隔,這使得以合理的確定性找到塊邊界成為可能。每個塊還帶有自己的32位CRC,因此損壞的塊可以與未損壞的塊區分開來。

bzip2Recovery 是一個簡單的程式,其目的是搜尋“.bz2”檔案中的塊,並將每個塊寫入自己的“.bz2”檔案中。然後可以使用“bzip2  –t”測試結果檔案的完整性,並解壓縮未損壞的檔案。

bzip2Recovery 接受一個引數,即受損檔案的名稱,並寫入一些檔案“rec00001file.bz2”、“rec00002file.bz2”等,其中包含提取的塊。輸出檔名的設計使得在隨後的處理中使用萬用字元。例如,“bzip2  -dc  rec*file.bz2  >  recovered_data”按正確的順序處理檔案。

處理大型bz2檔案時,bzip2恢復應該是最有用的,因為這些檔案將包含許多塊。在損壞的單塊檔案上使用它顯然是徒勞無功的,因為損壞的塊無法恢復。如果希望通過媒體或傳輸錯誤最大限度地減少任何潛在的資料丟失,可以考慮使用較小的塊大小進行壓縮。

 

5 、執行情況說明

壓縮的排序階段收集檔案中類似的字串。正因為如此,包含大量重複符號的檔案,如“aabaabaabaab.”(重複幾百次)可能比正常壓縮速度慢。在這方面,0.9.5及以上的版本比以前的版本要好得多。最壞壓縮時間與平均壓縮時間之比在10:1左右.對於以前的版本,這個數字更像是100:1。如果需要,可以使用-vvvv選項來非常詳細地監視進度。減壓速度不受這些現象的影響。

bzip 2 通常分配幾兆位元組的記憶體進行操作,然後以相當隨機的方式對其進行充電。這意味著壓縮和解壓縮的效能在很大程度上取決於您的機器能夠為快取丟失提供服務的速度。正因為如此,通過對程式碼進行小幅度的更改以降低漏出率,從而提供了不成比例的大幅度效能改進。我認為bzip 2在具有非常大快取的機器上表現最好。

7 、例項

1 )壓縮檔案

[root@localhost weijie]#  bzip2 1.c                   // 壓縮 1.c ,原始檔會被刪除

[root@localhost weijie]#  ls

11.c  1.c.bz2  2.c  3.c  4.c  5.c  6.c~  bak

[root@localhost weijie]#  bzip2 -c 2.c > res.bz2     // 1.c 壓縮到 res ,原始檔不動

[root@localhost weijie]#  ls

11.c  1.c.bz2  2.c  3.c  4.c  5.c  6.c~  bak  res.bz2

2 )解壓

[root@localhost weijie]#  bzip2 -d res.bz2            // 解壓

[root@localhost weijie]#  ls

11.c  1.c.bz2 2.c  3.c  4.c 5.c  6.c~  bak res

3 )將兩個檔案壓縮到一個檔案中

[root@localhost weijie]#  cat 1.c 2.c                   // 輸出兩個檔案的內容

hello world, 

i am david. 

i love linux, 

love code.

123

23

212

[root@localhost weijie]#  bzip2 –c 1.c > foo.gz        // 1.c 壓縮到 foo

[root@localhost weijie]#  bzip2 –c 2.c >> foo.gz       // 2.c 壓縮到 foo

[root@localhost weijie]# b gzip2 -d foo.gz              // 解壓 foo

[root@localhost weijie]#  cat foo                        // 顯示 foo 的內容

hello world, 

i am david. 

i love linux, 

love code.

123

23

212

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29270124/viewspace-2282685/,如需轉載,請註明出處,否則將追究法律責任。

相關文章