場景描述:為了節省磁盤空間,提高磁盤空間的使用效率,方便對批量文件的傳輸和管理,引入了文件壓縮技術。其原理簡單來說就是將原先未被數據占用的空間(每字節下未被使用的bit)進行重新規划和分配,以達到在有限的空間內盡可能多的存儲數據的目的。具體方法如下:
一、對於單個文件而言,常用的壓縮命令:compress(已淘汰)、gzip(速度最快/但壓縮比最低)、bzip2(速度稍慢/但壓縮比提升/比較常見)、xz(速度最慢/但壓縮比最高)
在Linux系統下,gzip/bzip2/xz的用法為:
1)gzip -c/d/t//v/# 文件名 |注意,對windows下的可執行的二進制文件*.exe進行壓縮時,一定不能使用選項,否則會導致終端崩潰!
-c 將要壓縮的文本的數據以文字類型輸出到屏幕上,可用於輸出重定向
-d 解壓縮
-t 檢驗一個壓縮文件的一致性
-v 顯示壓縮比
-# #代表數字,1-9,9等級最高,壓縮比最大,但速度最慢
注意,gzip工具壓縮后直接刪除了原文件,解壓縮后同樣刪除了壓縮文件。當原文件本身是純文本時,可以嘗試用zcat 文件名.gz讀取解壓后的文本內容!zgrep -n '關鍵字' 文件名.gz 過濾出包含關鍵字信息的行!特別地,當有需求在壓縮時必須保留原文本文件,則用 gzip -c 文件名 > 文件名.gz 進行保留!
2)bzip2 -c/d/k/z/t/v# 文件名 |bizp2的用法與gzip較為相像,但多了一些額外選項:
-k 保留原文件,壓縮或解壓縮時不對原文件進行刪除(默認同gzip一樣,自動刪除原文件)
-z 以默認等級進行壓縮,此項可忽略
同樣的,bzcat 文件名.bz2 bzgrep -n '關鍵字' 文件名.bz2 用法通gzip類似
3)xz -d/t/l/k/c/# 文件名 |xz 用法與bzip2較為相像,但多了一個額外選項:
-l 列出壓縮文件的相關信息
同樣的,xzcat 文件名.xz xzgrep -n '關鍵字' 文件名.xz 用法同bzip2類似
總結:從gzip到bzip2再到xz 壓縮比逐步提升,相應地,壓縮速度逐步減慢。相比於gzip,后兩者均提供了保留原文件的選項-k,xz還提供了-l 文件名.xz功能。至於三個工具的-t(測試壓縮文件完整性,以避免出錯)功能則鮮有用到。
二、對於多個文件而言,用功能強大的tar命令進行處理!類似於windows下的Winrar。
tar 命令選項及參數甚多,以下僅列出常用的:
-c:建立打包文件,可搭配-v 顯示過程
-t:查看打包文件的文件名(哪些文件被打包)
-x:解打包或解壓縮,可搭配-C 指定解打包或解壓縮后文件保存目錄
注意,以上三個選項無法同時出現!
-z:通過gzip支持壓縮/解壓縮,此時的文件名后綴最好是*.tar.gz
-j:通過bzip2支持壓縮/解壓縮,此時文件名后綴最好是*.tar.bz2
-J:通過xz支持壓縮/解壓縮,此時文件名后綴最好是*.tar.xz
注意,以上三個選項無法同時出現!
-v:顯示細節
-f filename:注意,-f后要緊接要處理的文件名
-C 目錄:配合x選項,將文件解壓到指定目錄
-p:保留備份數據原文本的權限及屬性,常用於備份重要的配置文件
-P:保留絕對路徑,即允許備份數據中含有根目錄!
--exclude=FILE 在壓縮過程之中不將FILE打包
關於tar命令最最常用的無外乎以下三種格式:
format1 打包並壓縮 tar -jcvf filename.tar.bz2 要被壓縮的目錄或文件名稱
format2 查詢tar包內容 tar -jtvf filename.tar.bz2
format3 解tar包 tar -jxvf filename.tar.bz2 [-C 目錄] 解開tar包 [到指定目錄]
下面給出幾個示例,看下tar命令的具體用法:
例1.將/etc/下的所有文件打包至/app下,並名命為etc.tar.bz2
[root@www app]# tar -jpcvf /app/etc.tar.bz2 /etc
可見tar命令如此強大,借助於-j(調用bzip2)備份后只有9.1M,相比於41M的源,真是小了不少!另外我們使用了-p,這在備份中很常用!需要特別注意的是,在生成tar包過程中,自動去除“/”,為的是在做解包操作時,不覆蓋源!!!下面我們趕緊看下這個tar包的內容:
[root@www app]# tar -tf etc.tar.bz2
篇幅較大,僅截取部分內容。注意!查看tar包內容時無需加-z/j/J,tar命令會自動識別包類型,想顯示細節如屬性權限等,可加-v
接下來我們將這個tar包解壓到/app/testdir下
[root@www app]# tar -xvf etc.tar.bz2 -C ./testdir/
注意,此時在testdir下生成了一個etc目錄,所有的源均放在了此目錄下!
例2.只解壓出例1的tar包中的etc/shadow這一個文件,其他不動
方法很簡單,執行命令:
[root@www app]# tar -xvf etc.tar.bz2 etc/shadow
發現,在生成的etc目錄下,僅有shadow這一個文件!
例3.打包備份/etc下所有比/etc/passwd文件的mtime時間更新的文件,包名為etc.newer.tar.bz2,放在/app下
處理過程也很簡單,調用--newer-mtime="2018/08/24"選項即可:(已通過stat查看了/etc/passwd文件的mtime)
[root@www app]# tar -jpcvf /app/etc.newer.tar.bz2 --newer-mtime="2018/08/24" /etc
補充說明:
如果單純對多個文件進行打包(僅打包,生成*.tar文件,不調用gzip/bzip2/xz等工具)那么最終的文件,我們稱為tarfile
如果調用了壓縮工具(-z/j/J)最終生成的*.tar.gz/bz2/xz,我們稱之為tarball