tar 與 unzip 指令完整教學指南:Linux 檔案歸檔與壓縮工具

tar 基本概念:什麼是 tar 指令?

tar (Tape Archive) 是 Unix/Linux 系統中最重要的歸檔工具,用於將多個檔案和目錄打包成單一檔案。對於系統管理員、DevOps 工程師和 SRE 來說,tar 是日常備份、部署和檔案管理的核心工具。

tar 語法結構與常用參數

# tar 基本語法
tar [操作選項] [修飾參數] [目標檔案] [來源檔案/目錄]

核心操作參數:

  • -c (–create): 建立新的 tar 歸檔檔案
  • -x (–extract): 解壓縮 tar 歸檔檔案
  • -t (–list): 列出 tar 檔案內容
  • -r (–append): 向現有 tar 檔案添加內容
  • -u (–update): 更新 tar 檔案中的內容

重要修飾參數:

  • -v (–verbose): 顯示詳細處理過程
  • -f (–file): 指定 tar 檔案名稱
  • -z (–gzip): 使用 gzip 壓縮 (.tar.gz)
  • -j (–bzip2): 使用 bzip2 壓縮 (.tar.bz2)
  • -J (–xz): 使用 xz 壓縮 (.tar.xz)
  • -C (–directory): 指定解壓縮目標目錄

tar 實戰範例:從基礎到進階應用

1. 建立 tar 歸檔檔案(打包)

# 基本打包:建立不壓縮的 tar 檔案
tar -cvf project_backup.tar /home/user/project/
# 說明:-c 建立,-v 顯示過程,-f 指定檔名

# gzip 壓縮打包(最常用)
tar -czvf website_backup.tar.gz /var/www/html/
# 說明:.tar.gz 格式,壓縮率佳且相容性高

# bzip2 壓縮打包(更高壓縮率)
tar -cjvf database_backup.tar.bz2 /var/lib/mysql/
# 說明:bzip2 壓縮率優於 gzip,但速度較慢

# xz 壓縮打包(最高壓縮率)
tar -cJvf logs_archive.tar.xz /var/log/
# 說明:xz 提供最佳壓縮率,適合長期存儲

2. 解壓縮 tar 檔案

# 基本解壓縮到當前目錄
tar -xvf backup.tar

# 解壓縮 gzip 壓縮的 tar 檔案
tar -xzvf backup.tar.gz

# 解壓縮到指定目錄
tar -xzvf backup.tar.gz -C /restore/location/

# 解壓縮特定檔案或目錄
tar -xzvf backup.tar.gz specific_directory/ specific_file.txt

# 檢視 tar 檔案內容而不解壓縮
tar -tzvf backup.tar.gz | head -20

3. tar 進階技巧與 SRE 應用

# 排除特定檔案類型進行打包
tar -czvf clean_backup.tar.gz \
    --exclude='*.log' \
    --exclude='*.tmp' \
    --exclude='node_modules' \
    --exclude='.git' \
    /project/source/

# 使用檔案清單進行選擇性備份
find /var/log -name "*.log" -mtime +7 > old_logs.txt
tar -czvf old_logs_backup.tar.gz -T old_logs.txt

# 增量備份:僅備份更新的檔案
tar -czvf incremental_backup.tar.gz \
    --listed-incremental=backup.snar \
    /important/data/

# 管道操作:直接透過網路傳輸
tar -czf - /source/data | ssh user@backup-server 'cat > /backup/data.tar.gz'

unzip 基本概念:處理 ZIP 格式的專業工具

unzip 是專門處理 ZIP 格式壓縮檔的命令列工具。ZIP 格式因其跨平台相容性,在 Windows 與 Linux 系統間檔案交換時特別重要。

unzip 語法與核心參數

# unzip 基本語法
unzip [選項] [ZIP檔案] [檔案選擇器] [-d 目標目錄]

主要參數說明:

  • -l: 列出 ZIP 檔案內容
  • -t: 測試 ZIP 檔案完整性
  • -d: 指定解壓縮目標目錄
  • -o: 覆蓋現有檔案(不詢問)
  • -n: 不覆蓋現有檔案
  • -j: 扁平解壓縮(忽略目錄結構)
  • -q: 安靜模式
  • -v: 詳細模式

unzip 實戰應用範例

1. 基本 ZIP 檔案解壓縮

# 解壓縮到當前目錄
unzip archive.zip

# 解壓縮到指定目錄
unzip archive.zip -d /target/directory/

# 覆蓋模式解壓縮(適合自動化腳本)
unzip -o archive.zip -d /deployment/path/

# 安全模式:不覆蓋現有檔案
unzip -n archive.zip

2. 選擇性解壓縮與檔案過濾

# 只解壓縮特定類型檔案
unzip archive.zip "*.txt" "*.conf" -d /config/

# 只解壓縮特定目錄
unzip archive.zip "config/*" "scripts/*"

# 排除特定檔案類型
unzip archive.zip -x "*.log" "temp/*" "__MACOSX/*"

# 使用萬用字元進行複雜篩選
unzip archive.zip "*/important*" -x "*/test/*"

3. ZIP 檔案檢視與驗證

# 列出 ZIP 檔案詳細內容
unzip -l archive.zip

# 簡潔列表模式
unzip -Z archive.zip

# 測試 ZIP 檔案完整性
unzip -t archive.zip

# 檢視特定檔案資訊
unzip -l archive.zip | grep -i config

4. 批次處理與自動化

# 批次解壓縮多個 ZIP 檔案
for zipfile in *.zip; do
    echo "處理: $zipfile"
    unzip -o "$zipfile" -d "${zipfile%.zip}/"
done

# 安全的批次解壓縮(含錯誤處理)
#!/bin/bash
for zipfile in *.zip; do
    if unzip -t "$zipfile" >/dev/null 2>&1; then
        echo "✓ $zipfile 檢驗通過,開始解壓縮"
        unzip -o "$zipfile" -d "extracted/${zipfile%.zip}/"
    else
        echo "✗ $zipfile 檔案損壞,跳過處理"
    fi
done

效能比較與最佳實務

壓縮格式效能比較表

壓縮格式壓縮速度壓縮率CPU使用記憶體使用相容性適用場景
tar (無壓縮)最快極低極低優秀快速打包
tar.gz (gzip)良好中等優秀日常備份
tar.bz2 (bzip2)中等優秀中等良好長期存儲
tar.xz (xz)最佳最高良好頻寬受限
ZIP良好中等最佳跨平台交換

SRE 場景應用建議

選擇 tar 的情況:

  • 系統備份:完整保留 Unix 檔案屬性與權限
  • 容器化部署:Docker image layer 建構
  • 日誌歸檔:大量小檔案的高效打包
  • 程式碼版本管理:Git archive 替代方案

選擇 unzip 的情況:

  • 第三方軟體安裝:處理供應商提供的 ZIP 套件
  • 跨平台檔案交換:Windows 與 Linux 間的檔案傳輸
  • Web 應用部署:處理前端建構產生的 ZIP 檔案
  • 資料匯入處理:解壓縮來自外部系統的資料檔

效能最佳化技巧

# 使用 pigz 進行多執行緒 gzip 壓縮
tar -c /large/dataset | pigz -p 8 > backup.tar.gz

# 使用 pxz 進行多執行緒 xz 壓縮
tar -c /important/data | pxz -T 0 > backup.tar.xz

# 網路傳輸時的即時壓縮
tar -czf - /source | ssh user@backup 'cat > /backup/$(date +%Y%m%d).tar.gz'

# 記憶體受限環境的低資源壓縮
tar -cf - /data | gzip -1 > fast_backup.tar.gz

故障排除與除錯技巧

常見 tar 問題與解決方案

1. 權限問題

# 問題:解壓縮時權限不足
# 解決:使用 sudo 或調整目標目錄權限
sudo tar -xzvf backup.tar.gz -C /protected/path/

# 保持原有權限的解壓縮
tar -xzvpf backup.tar.gz  # -p 保留權限

2. 路徑問題

# 問題:絕對路徑造成的安全風險
# 解決:移除前導路徑分隔符
tar -czvf backup.tar.gz --transform 's,^/,,' /absolute/path/

# 檢查 tar 檔案中的路徑
tar -tvf suspicious.tar | grep -E '^[^/]'

3. 磁碟空間不足

# 預估解壓縮後大小
tar -tzvf backup.tar.gz | awk '{sum+=$3} END {print "總大小:", sum/1024/1024, "MB"}'

# 分段解壓縮大檔案
tar -tzvf large.tar.gz | head -100 | cut -d' ' -f6- > first_batch.txt
tar -xzvf large.tar.gz -T first_batch.txt

常見 unzip 問題與解決方案

1. 編碼問題

# 中文檔名亂碼問題
unzip -O CP936 chinese_files.zip  # Windows 簡體中文
unzip -O UTF-8 unicode_files.zip  # UTF-8 編碼

# 使用 unar 作為替代方案
unar chinese_archive.zip

2. ZIP 炸彈防護

# 檢查壓縮比避免 ZIP 炸彈
unzip -l suspicious.zip | awk 'NR>3 {compressed+=$1; uncompressed+=$3} END {
    if (uncompressed/compressed > 100) 
        print "警告:壓縮比異常,可能是 ZIP 炸彈"
}'

3. 錯誤碼處理

#!/bin/bash
unzip archive.zip
case $? in
    0) echo "解壓縮成功" ;;
    1) echo "警告:部分檔案無法解壓縮" ;;
    2) echo "錯誤:嚴重錯誤" ;;
    3) echo "錯誤:CRC 錯誤" ;;
    *) echo "未知錯誤" ;;
esac

進階除錯與監控

# tar 詳細除錯模式
tar -czvf backup.tar.gz --debug --checkpoint=1000 /data/ 2>&1 | tee tar.log

# 監控壓縮進度
tar -czf backup.tar.gz --checkpoint=1000 --checkpoint-action=dot /large/data/

# 驗證 tar 檔案完整性
tar -tzf backup.tar.gz >/dev/null && echo "檔案完整" || echo "檔案損壞"

# 比較歸檔前後的差異
find /source -type f -exec md5sum {} \; > before.md5
tar -xzf backup.tar.gz
find /restored -type f -exec md5sum {} \; > after.md5
diff before.md5 after.md5

相關關鍵字: Linux commands, file compression, system administration, backup strategies, DevOps tools, SRE best practices

404NOTE
404NOTE
文章: 40

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *