天天看點

壓縮解壓和tar指令

文章目錄

      • `gzip`、`bzip2`、`xz`、`compress`是壓縮/解壓指令
        • 壓縮:
        • 解壓:
      • GNU`tar`指令是歸檔(打包)指令
        • 打包和解包:
        • 打包并壓縮:
        • 将打包并壓縮的檔案進行先解壓再解包:
        • 注意:
      • zip和unzip既可以壓縮又可以歸檔
      • 7z可以壓縮歸檔和解壓

gzip

bzip2

xz

compress

是壓縮/解壓指令

這些指令隻能壓縮檔案,不能壓縮目錄(

gzip

compress

-r

選項隻是将檔案夾内的所有檔案逐一壓縮)。

壓縮:

壓縮并删除源檔案,若目前目錄有同名檔案會報錯或提示是否覆寫,可以加

-f

參數強制覆寫:

gzip file    #輸出:file.gz
bzip2 file    #輸出:file.bz2
xz file      #輸出:file.xz
compress file #輸出:file.Z
           

壓縮但保留源檔案:

gzip -c file  > file.gz 
bzip2 -c file  > output.bz2 
xz -c file > /root/file.xz
compress -c file > file.Z
           

bzip2

xz

還可以用

-k

參數保留源檔案,但無法指定壓縮檔案的路徑和檔案名。

bzip2 -k file  #輸出:file.bz2
xz -k file    #輸出:file.xz
           

除了

compress

,其它三個指令還可以指定壓縮比:

1~9

1

最快,

9

最好:

gzip -1 file
bzip2 -k6 file
xz -2 file
           

解壓:

解壓并删除壓縮檔案:

gzip -dN file.gz   # -N參數保持壓縮前的檔案名,後面有說明
bzip2 -d file.bz2
xz -d file.xz      
compress -d file.Z
           

解壓但保留壓縮檔案:

gzip -dc file.gz  > file  
bzip2 -dc file.bz2  > file
xz -dc file.xz > /root/file
compress -dc file.Z > file  
           

bzip2

xz

還可以用

-k

參數保留源檔案,但是無法指定解壓檔案的路徑和檔案名。

bzip2 -dk file.bz2  #得到file
xz -dk file.xz    #得到file
           

GNU

tar

指令是歸檔(打包)指令

歸檔就是将多個檔案或檔案夾打包為一個檔案。

tar

指令不會對源檔案造成影響,但若是輸出檔案存在則會直接覆寫,如果輸出檔案是目錄且目錄已經存在,會進行目錄合并,目錄裡的同名檔案會直接覆寫。

打包和解包:

tar -c input1 input2 > file.tar #将input1、input2打包為file.tar,tar會記錄源檔案的時間戳資訊
tar -cf file.tar input1 input2  #将input1、input2打包為file.tar
tar -xf file.tar -C output_dir  #将file.tar解包到output_dir,-C指定解壓位置(必須是目錄),預設為目前目錄

tar -tf file.tar #列出file.tar包裡的所有檔案
tar -xf file.tar input1 #隻解包file.tar裡的input1出來
           

tar

指令的參數可以加

-

也可以不加,

-C

參數必須加

-

打包并壓縮:

tar

指令通過指定參數可以和壓縮指令一起使用,會先打包,再壓縮。

gzip

bzip2

xz

compress

分别對應參數

z

j

J

Z

tar -czf file.tar.gz input1 input2 #先将input1、input2進行打包,然後再用gzip進行壓縮。擴充名也可為.tgz
tar -cjf file.tar.bz2 input1 input2 
tar cJf file.tar.xz input1 input2
tar cZf file.tar.Z input1 input2
           

将打包并壓縮的檔案進行先解壓再解包:

可以直接解包,

tar

能自動識别是用什麼算法進行的壓縮,并選擇相應解壓算法:

也可以指定解壓算法,若指定的解壓算法和壓縮算法不比對會報錯:

tar -xzf output.tar.gz
tar -xjf file.tar.bz2
tar xJf file.tar.xz
tar xZf file.tar.Z
           

注意:

Linux系統檔案時間戳分atime、mtime、ctime,本文後面談到的時間戳全部隻指mtime(修改時間戳)。

A:

使用

bzip2

xz

compress

壓縮得到的壓縮檔案的内容隻取決于源檔案的内容,而源檔案的檔案名、權限、時間戳等資訊都不會作為内容儲存。是以md5值相同的檔案得到的壓縮檔案md5也相同。

若不使用

-c

參數,用以上指令壓縮檔案或解壓檔案,得到的輸出檔案的檔案名和權限會和源檔案一樣。

B:

gzip

-n

參數和A相同。

C:

gzip

壓縮預設會保留源檔案的檔案名和時間戳資訊,若不想保留需加

-n

參數。

若想解壓獲得原來的檔案名需加

-N

參數(否則會和壓縮檔案同名),若想獲得原來的時間戳還不能用

-c

參數。

gzip -dN file.gz
gzip -lN file.gz #檢視壓縮前的檔案名等資訊
           

D:

使用

tar

打包得到的

.tar

檔案的檔案内容包含了以下資訊:源檔案的檔案内容、檔案名(目錄還會儲存目錄結構)、檔案權限、時間戳等。打包時可以通過

--mtime

參數指定打封包件的時間戳資訊,這樣打包後檔案的檔案内容隻取決于源檔案的内容、權限和檔案名(若是目錄還包括目錄結構)。

最後:

如果用

tar -czf

對相同内容的檔案打包并壓縮,不同時間生成的

.tar.gz

檔案的md5是不同的,因為

tar -czf

指令會先打包成

.tar

檔案再調用

gzip

進行壓縮,

.tar

檔案的時間戳不同是以壓縮後的檔案内容也不同。

以下指令可以保證不同時間打包的相同内容的檔案md5相同:

tar -c input1 input2 | gzip -n > output.tar.gz
           

但是如果檔案的時間戳改變了,即使檔案的内容沒有發生變化(比如用vim打開檔案,沒有修改但是用

wq

退出),打封包件的md5值也會發生變化。

怎麼保證對相同内容的檔案打包總是生成md5值一樣的檔案呢:

tar -c --mtime='1988-01-01' input1 input2 | gzip -n > output.tar.gz
           

上面說的相同内容的檔案,包括檔案内容、檔案名和權限都相同(若是目錄還包括目錄結構)。

zip和unzip既可以壓縮又可以歸檔

zip output.zip input1 input2 #将input1、input2壓縮打包到output.zip
unzip output.zip  #将output.zip解包解壓
           

若壓縮的檔案裡有中文名,解壓後可能會亂碼,解決此問題可以使用

unar

解壓:

unar output.zip

# 指定解壓密碼 
unar -p 123456 output.zip
           

7z可以壓縮歸檔和解壓

安裝:

yum -y install p7zip

sudo apt install p7zip
           

壓縮:

7z a -t7z -r output.7z ~/input
7za a -t7z -r output.7z ~/input
           

解壓:

7z x output.7z -r -o ~/output
7za x output.7z -r -o ~/output