文章目錄
-
-
- `gzip`、`bzip2`、`xz`、`compress`是壓縮/解壓指令
-
- 壓縮:
- 解壓:
- GNU`tar`指令是歸檔(打包)指令
-
- 打包和解包:
- 打包并壓縮:
- 将打包并壓縮的檔案進行先解壓再解包:
- 注意:
- zip和unzip既可以壓縮又可以歸檔
- 7z可以壓縮歸檔和解壓
-
gzip
、 bzip2
、 xz
、 compress
是壓縮/解壓指令
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
指令不會對源檔案造成影響,但若是輸出檔案存在則會直接覆寫,如果輸出檔案是目錄且目錄已經存在,會進行目錄合并,目錄裡的同名檔案會直接覆寫。
打包和解包:
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