Linux 命令之 tar

送南阳马生序發表於2024-11-20

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 測試如下:

相關文章