天天看點

linux伺服器的檔案壓縮/解壓縮

作者:xiaoyutab

常見的檔案壓縮格式及對應字尾

檔案字尾 描述
.gz 表示由gzip壓縮工具壓縮的檔案
.bz2 表示由bzip2壓縮工具壓縮的檔案
.tar 表示由tar打包程式打包的檔案(tar沒有壓縮功能隻是把目錄合并成一個檔案)
.tar.gz 先由tar打包,再由gzip壓縮
.tar.bz2 先由tar打包,再由bzip2壓縮
.tar.xz 先由tar打包,再xz壓縮
.tgz 先由tar打包,再由gzip壓縮
.tbz2 先由tar打包,再由bzip2壓縮
.txz 先由tar打包,再xz壓縮
.7z 由 p7zip 進行壓縮的檔案

Linux系統下壓縮檔案

Linux下使用tar方式進行壓縮檔案,使用方式如下:

tar zcvf xxx.tgz file1 file2......

排除某檔案在xxx.tgz之後插入--exclude排除檔案

參數解釋:

-z 使用gzip壓縮/解壓縮
-j 使用bz2屬性的壓縮/解壓縮
-Z 使用 compress 指令進行壓縮或解壓縮
-a 使用歸檔字尾名來決定壓縮程式(若實在不想更換各指令可以直接使用此參數進行自動處理)
-c 建立tar包
-r 追加檔案
-t 列出文檔包中的檔案
-p 包含檔案權限壓縮
-u 隻有本地檔案較新時才更新壓縮包中的對應檔案
-v 顯示壓縮的詳細檔案
-f 遞歸方式,壓縮檔案夾時使用
-P 保留絕對路徑
-x 從歸檔中解出檔案(提取壓縮包)
--exclude 排除某檔案/檔案夾。若排除檔案夾的話最後不能添加目錄分隔符           

各檔案解壓示例

# 通用壓縮
$ tar acvf a.tar.7z ./*
# 通用解壓縮
$ tar axvf a.tar.7z
# 解壓tar.gz檔案(tgz檔案為tar.gz檔案的簡寫,此處省略)
$ tar zxvf a.tar.gz
# 解壓tar.xz檔案(txz檔案為tar.xz檔案的簡寫,此處省略)
$ tar xvf a.tar.xz
# 解壓tar.bz2檔案(tbz2檔案均為tar.bz2檔案的簡寫,此處省略)
$ tar jxvf a.tar.bz2
# 解壓tar.Z檔案(tbz檔案或者Z檔案均為tar.Z檔案的簡寫)
$ tar Zxvf a.tar.Z           

其他格式的壓縮/解壓縮

在Linux下,一般會先使用tar進行打包,然後再使用各個指令進行壓縮,壓縮後一般使用tar.zip / tar.rar / tar.7z 等形式進行命名。

另,在Linux系統中,如果字尾是tar.gz、tar.xz、tar.bz2、tar.Z檔案字尾時,則是直接使用tar内置的壓縮算法進行壓縮

PS:使用tar打包的原因一般是tar支援

格式 壓縮 解壓縮
zip zip -r <目标檔案>.zip <源檔案> unzip <源檔案>.zip
rar rar a <目标檔案>.rar <源檔案> unrar e <源檔案>.rar
7z 7zr a <目标檔案>.7z <源檔案> 7z x <源檔案>.7z

Windows壓縮的zip在Linux下解壓縮

由于zip格式中并沒有指定編碼格式,Windows下生成的zip檔案中的編碼是GBK/GB2312等,是以,導緻這些zip檔案在Linux下解壓時出現亂碼問題,因為Linux下的預設編碼是UTF8。

目前主流的方法是采用-O指定編碼集的方式unzip -O cp936 <zip-file>,但是這種方式遇到沒有-O選項的unzip指令就需要采用其他方法了。(此處建議在windows下解壓縮後,從新使用其他格式進行壓縮)

例如,采用Python的方式

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys
import zipfile

#print "Processing File " + sys.argv[1]

file=zipfile.ZipFile(sys.argv[1],"r");
for name in file.namelist():
    utf8name=name.decode('gbk')
#    print "Extracting " + utf8name
    pathname = os.path.dirname(utf8name)
    if not os.path.exists(pathname) and pathname!= "":
        os.makedirs(pathname)
    data = file.read(name)
    if not os.path.exists(utf8name):
        fo = open(utf8name, "w")
        fo.write(data)
        fo.close()
file.close()           

繼續閱讀