2014年12月4日 星期四

Linux, bash, 壓縮, tar, bz2, xz, 7z, 壓縮率

Linux, bash, 壓縮, tar, bz2, xz, 7z, 壓縮率

如果只是想查各種副檔名的解壓縮指令,只要Google副檔名就可以找到(例如:tar.bz2)

這邊主要是在對資料夾壓縮時,為了自訂壓縮率而深入研究壓縮指令而產生。

tar 可以對檔案或資料夾進行單存的打包(或解開打包),後面接c代表打包,x代表解開打包。這邊在Bash底下產生一個簡單的文字檔來練習:

echo "Hello World" > text
tar c text
# 輸出 text000644 000765 000000 00000000014 12437746653 012241 0ustar00wemeewheel000000 000000 Hello World

# 如果要儲存,加上參數f,並指定存檔名稱
tar cf text1.tar text

# 或者使用串流來寫入檔案也可以(實際應用不建議)
tar c text > text2.tar

原始檔案12B, 打包後2K, 使用串流寫入的10K, 可以確定打包完全不會有壓縮的效果

 12B 12  4 10:57 text
2.0K 12  4 11:01 text1.tar
 10K 12  4 11:01 text2.tar

其實打包主要目的在於,我常用的bz2壓縮,只能對檔案壓縮,不能對目錄壓縮,所以才需要先把目錄打包成一個檔案,再用bz2去壓縮它

接下來,弄個目錄跟文字檔來測試

mkdir dir
echo "Hello World" > dir/text

tar cf dir1.tar dir
tar c dir > dir2.tar

結果一樣,使用串流寫入的,佔的容量比較大

102B 12  4 11:28 dir
2.5K 12  4 11:44 dir1.tar
 10K 12  4 11:44 dir2.tar

接下來,使用bz2壓縮看看

bzip2 -z dir1.tar
bzip2 -z dir2.tar

來看看所佔用的容量

102B 12  4 11:28 dir
167B 12  4 11:44 dir1.tar.bz2
169B 12  4 11:44 dir2.tar.bz2

壓縮過後都變小了,分成先打包,再用bz2壓縮,其實是因為tar指令只是打包,頂多只能加上參數j,表示打包過程使用bz2,(或參數z,表示打包過程使用gz),無法指定壓縮比

# 將目錄打包之後,再用bz2壓縮並指定壓縮比
bzip2 -9 -z dir1.tar

如果要寫成一行的話,可以打包時,輸出到串流,在使用管線指令輸入到bzip2, 因為輸入是串流,bzip2無法指定要壓縮的檔案,所以把壓縮結果使用參數c,再一次輸出到串流,並儲存成檔案

tar c dir | bzip2 -c > dir.tar.bz2

# tar 無法指定壓縮比,在bzip2指定壓縮比
tar c dir | bzip2 -9 -c > dir.tar.bz2

同理,如果使用xz壓縮時,想一併指定壓縮比,也用同樣方式

tar c dir | xz -9 -c > dir.tar.xz

因為bz2壓縮,在Windows開啟中文檔名,常常變成亂碼,可以改用7zip來壓縮,如果使用7zip,他沒有辦法吃管線進來的資料,那怎麼辦?分兩行指令,先打包在壓縮嗎?

不用啦~ 7zip可以直接對目錄壓縮,直接壓縮,只是它指定壓縮比的參數是-mx數字

7za a -mx9 dir.7z dir

這樣子就直接對dir這個目錄以最大壓縮的壓縮比去執行了

沒有留言:

張貼留言