Linux基礎命令---bzip2

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+200008=56萬字節的內存。類似地,解壓縮程序將分配3700k,但只會觸及100k+200004=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]# bgzip2 -d foo.gz //解壓foo
[root@localhost weijie]# cat foo //顯示foo的內容
hello world,
i am david.
i love linux,
love code.
123
23
212

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章