1 tar 命令介紹
常見的壓縮包有 .tar.gz、.tar.xz、.tar.bz2,以及 .rar、.zip、.7z 等壓縮包。
常見的 tar 選項:
- 1. 檔案操作選項:
-c, --create : 建立一個新壓縮檔案
-x, --extract : 解壓檔案
- 2. 解壓縮選項:
-j, --bzip2 : 使用 bzip2 演算法解壓縮檔案
-J, --xz : 使用 xz 演算法解壓縮檔案
-z, --gzip : 使用 gzip 演算法解壓縮檔案
- 3. 其它選項:
-f, --file : 使用壓縮包名稱。該引數必須是最後一個引數,且後面只能跟檔名
-v, --verbose : 列印處理的檔案
-C, --directory : 解壓到指定目錄
2 壓縮與解壓縮
不同壓縮包的壓縮與解壓速度比較參見:https://blog.csdn.net/zzz3265/article/details/121871829
lz4、lzop 壓縮時間快但壓縮率堪憂;lzma、xz 壓縮率優秀但耗時較長;gzip 則兩者兼顧;
2.1 壓縮
假如我有一個 a.c 檔案,需要分別生成各種壓縮包。
# 生成 tar.bz2 壓縮包
tar -cjvf a.tar.bz2 a.c
# 生成 tar.xz 壓縮包
tar -cJvf a.tar.xz a.c
# 生成 tar.gz 壓縮包
tar -czvf a.tar.gz a.c
系統如果已經安裝 zip,則可以使用 zip -r filename.zip file/path 生成 .zip 壓縮包(-r 表示遞迴壓縮)。
同樣的,使用 rar a filename.rar file/path 生成 .rar 壓縮包
rar 安裝包下載地址:https://www.rarlab.com/rar/rarlinux-x64-6.0.0.tar.gz而 .7z 壓縮包的生成見其它文章,ubuntu 系統安裝 7z 命令:apt install p7zip-full
2.2 解壓
# 解壓 tar.bz2 壓縮包
tar -xjvf a.tar.bz2
# 解壓 tar.xz 壓縮包
tar -xJvf a.tar.xz
# 解壓 tar.gz 壓縮包
tar -xzvf a.tar.gz
使用
unzip filename.zip
解壓 .zip 檔案;使用
rar x filename.rar
解壓 .rar 檔案
4 高階用法
4.1 排除目錄
實際生成壓縮包時,我們可能需要排除一些日誌檔案、快取檔案、版本管理檔案等:
C:.
│
└─tar_test # 根目錄
│ a.c # 根目錄下的原始檔
│
├─.git # 版本管理目錄
│ │ config
......
├─b # 模組目錄
│ b.c
│ b.h
│
├─imgs # 圖片目錄
│ test.jpg
│
├─include # 根目錄下的標頭檔案目錄
│ a.h
│
└─logs # 日誌目錄
tar.log
1)僅排除日誌目錄:tar -czvf tar_test.tar.gz --exclude=tar_test/logs tar_test/
關於 --exclude 後面的路徑:
1. 不可以是絕對路徑,如 /root/tar_test/logs
2. 不能透過 ./ 指定相對路徑,如 ./tar_test/logs
3. 路徑不能以 / 開始,如 /tar_test/logs
4. 路徑不能以 / 結束,如 tar_test/logs/
5. --exclude 需要位於壓縮路徑前方
2)排除版本管理目錄 .git:tar -czvf tar_test.tar.gz --exclude-vcs tar_test/
3)只壓縮標頭檔案:tar -czvf tar_test.tar.gz --exclude-vcs --exclude=tar_test/imgs --exclude=tar_test/logs --exclude=tar_test/*.c tar_test/
4.2 顯示進度
4.2.1 指令碼解壓縮
git-bash 與 ubuntu 系統驗證透過。
#!/bin/bash
#/##
# 使用 tar 解壓檔案,顯示解壓進度
#
# @author Aaron
# @since 2020/05/07
# @param $1 解壓目標檔案,需要指定當前路徑或絕對路徑
# @param $2 檔名
# @param $3 目錄路徑
#
#/
uncompress() {
TOTAL_SIZE=$(gzip -l $1 | grep '%' | awk '{print $2}')
BLOCK_SIZE=$(expr $TOTAL_SIZE / 51200)
BLOCK_SIZE=$(expr $BLOCK_SIZE + 1)
tar --blocking-factor=$BLOCK_SIZE --checkpoint=1 \
--checkpoint-action="ttyout=$2 解壓中: %u%\r" -zxf $1 -C $3
}
uncompress U-Boot.tar.gz uboot bak
其中:
$1
是要解壓的檔案;awk '{print $2}'
命令中的$2
是管道傳遞過來的引數不用管,ttyout
後面的$2
是指解壓時的自定義提示內容;$3
指要解壓到的目標路徑。使用 “uncompress U-Boot.tar.gz u-boot bak” 命令呼叫該函式,結果如下:
4.2.2 命令解壓縮
pv ${FILE_NAME} | tar -zxf -
4.2.3 壓縮排度
#!/bin/bash
#/##
# 使用 tar 壓縮檔案,顯示解壓進度
#
# @author Aaron
# @since 2020/05/07
# @param $1 要壓縮的檔案目錄
# @param $2 要生成的檔名稱
#
#/
compress() {
tar -cf - $1 | pv -s $(($(du -sk $1 | awk '{print $1}') * 1024)) | gzip > $2
}
compress bak/U-Boot uboot.tar.gz
WSL 中的 ubuntu 測試如下: