格式選擇決策樹
需求分析:
├─ 跨平台相容性最高 → zip
├─ Linux 專用、最大壓縮比 → xz / zstd (高等級)
├─ 速度優先、即時備份 → zstd -1 / lz4
├─ 固化格式、長期歸檔 → tar + xz/zstd
├─ 需加密分卷 → 7z / zip -e
└─ 管線串流、無中間檔 → tar | ssh / tar | gzip/xz/zstd
核心指令速查表
| 操作 | tar + gzip | tar + xz | tar + zstd | 7z | zip |
| 建立 | tar -czf a.tar.gz dir | tar -cJf a.tar.xz dir | tar --zstd -cf a.tar.zst dir | 7z a a.7z dir | zip -r a.zip dir |
| 解壓 | tar -xzf a.tar.gz | tar -xJf a.tar.xz | tar --zstd -xf a.tar.zst | 7z x a.7z | unzip a.zip |
| 列表 | tar -tzf a.tar.gz | tar -tJf a.tar.xz | tar --zstd -tf a.tar.zst | 7z l a.7z | unzip -l a.zip |
| 只解單檔 | tar -xzf a.tar.gz path/file | tar -xJf a.tar.xz path/file | tar --zstd -xf a.tar.zst path/file | 7z e a.7z path/file | unzip a.zip path/file |
| 排除模式 | tar -czf a.tar.gz --exclude='*.log' dir | 同左 | 同左 | 7z a a.7z dir -x!*.log | zip -r a.zip dir -x *.log |
| 保留權限/擁有者 | tar -czpf a.tar.gz dir (需 root) | 同左 | 同左 | 預設保留 | zip -r a.zip dir (不保留 UID/GID) |
| 多執行緒 | tar -czf - dir | pigz > a.tar.gz | tar -cJf - dir | pixz > a.tar.xz | tar --zstd -cf a.tar.zst -T4 dir (zstd 1.5+) | 7z a -mmt=on a.7z dir | zip -r -mm a.zip dir (少見) |
進階參數深度解析
tar 關鍵選項
-c, --create 建立
-x, --extract, --get 解壓
-t, --list 列表
-f, --file=ARCHIVE 檔案名 (必須緊接)
-v, --verbose 顯示過程
-z, --gzip gzip 過濾器
-J, --xz xz 過濾器
--zstd zstd 過濾器 (tar 1.31+)
--lzma, --lzip 其他
-P, --absolute-paths 保留絕對路徑 (預設移除前導 /)
--no-recursion 不遞迴
--one-file-system 不跨檔案系統
--exclude=PATTERN 排除
--exclude-from=FILE 從檔案讀取排除清單
--transform=EXPR sed 風格路徑重寫
--strip-components=N 移除前 N 級目錄
--owner=USER --group=GROUP 強制擁有者 (建立時)
--mtime=DATE 統一修改時間 (可重現建置)
--numeric-owner 數值 UID/GID (跨系統)
--acls --xattrs --selinux 保留擴充屬性
壓縮等級與效能權衡
| 工具 | 等級範圍 | 預設 | 推薦 (平衡) | 極速 | 極壓 |
| gzip | 1-9 | 6 | -6 | -1 | -9 |
| xz | 0-9 | 6 | -6 / -3 (快) | -0 / -1 | -9 / -e |
| zstd | 1-22 (負數為極速) | 3 | -3 / -5 | -1 / -3 | -19 / -22 (極慢) |
| 7z (LZMA2) | 0-9 | 5 | -mx=5 | -mx=1 | -mx=9 |
# 指定等級
tar -czf a.tar.gz -I 'gzip -9' dir
tar -cJf a.tar.xz -I 'xz -6' dir
tar --zstd -cf a.tar.zst -I 'zstd -5 -T4' dir
7z a -mx=7 a.7z dir
gzip -9 file
zstd -19 file.tar # 極壓備份
實戰場景範例
1. 系統備份 (排除虛擬檔案系統、保留屬性)
tar --zstd -cf /backup/root-$(date +%F).tar.zst \
--exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run \
--exclude=/tmp --exclude=/var/tmp --exclude=/backup \
--exclude=/mnt --exclude=/media --exclude=/lost+found \
--acls --xattrs --selinux --numeric-owner \
-C / .
2. 專案發布 (排除 .git、node_modules、.venv、__pycache__)
tar -czf project-release.tar.gz \
--exclude-vcs --exclude='*/node_modules' --exclude='*/.venv' --exclude='*/__pycache__' \
--exclude='*.pyc' --exclude='*.log' --exclude='.DS_Store' \
--transform='s,^,project/,' \
.
3. 遠端同步備份 (管線 + SSH,無本地暫存)
# 本地 → 遠端
tar --zstd -cf - /source --exclude=/source/tmp | ssh user@backup "cat > /backup/src-$(date +%F).tar.zst"
# 遠端 → 本地
ssh user@server "tar --zstd -cf - /data --exclude=/data/tmp" | tar --zstd -xf - -C /restore
4. 分卷傳輸 (大檔案分割)
# 7z 分卷 (每卷 100MB)
7z a -v100m backup.7z /source
# zip 分卷
zip -r -s 100m backup.zip /source
# 合併還原
7z x backup.7z.001
# 或
cat backup.zip.z01 backup.zip.z02 ... backup.zip > backup.zip && unzip backup.zip
5. 加密壓縮
# 7z AES-256
7z a -p -mhe=on -mx=5 encrypted.7z /source
# -p 互動輸入密碼, -mhe=on 加密檔名
# zip (較弱 ZipCrypto, 或 AES-256 需支援)
zip -e -r encrypted.zip /source
# OpenSSL + tar (標準管線)
tar -cf - /source | openssl enc -aes-256-cbc -pbkdf2 -out backup.tar.enc
# 解密
openssl enc -d -aes-256-cbc -pbkdf2 -in backup.tar.enc | tar -xf -
現代化工具鏈
| 工具 | 特色 | 安裝 |
| zstd | Facebook 開發、壓縮/解壓極快、支援多執行緒、可調等級寬廣、標準化 RFC 8878 | dnf/apt install zstd |
| pigz / pixz | gzip/xz 多執行緒包裝 | dnf/apt install pigz pixz |
| lz4 | 極速壓縮 (500MB/s+)、適合即時傳輸/日誌 | dnf/apt install lz4 |
| tar 1.35+ | 原生 --zstd、--lz4、--zstdmt、--transform 增強 | 新版發行版內建 |
| borgbackup / restic | 去重備份、加密、掛載瀏覽、遠端儲存 | pip install borgbackup / dnf install restic |
| squashfs | 唯讀壓縮檔案系統、掛載即用、嵌入式/容器層常用 | mksquashfs / unsquashfs |
效能基準參考 (單核心、典型文字/原始碼資料)
| 工具/等級 | 壓縮速度 (MB/s) | 解壓速度 (MB/s) | 壓縮比 | 適用場景 |
| lz4 | 750 | 4000 | 2.1x | 即時日誌、記憶體壓縮、ZRAM |
| zstd -1 | 470 | 1380 | 2.9x | 快速備份、CI 成品 |
| zstd -3 (預設) | 180 | 550 | 3.2x | 通用平衡 |
| gzip -6 | 90 | 280 | 2.7x | 相容性優先 |
| xz -6 | 25 | 80 | 3.5x | 長期歸檔、軟體發布 |
| zstd -19 | 2.5 | 500 | 3.8x | 冷備份、一次寫入多次讀 |
| 7z -mx=9 | 5 | 70 | 3.7x | 高壓縮比、分卷、加密 |
常見陷阱避雷
tar -czf a.tar.gz * 不會包含隱藏檔 → 用 tar -czf a.tar.gz .
- 解壓覆蓋現有檔案無警告 → 加
-k, --keep-old-files 或先 -t 列表確認
- 絕對路徑壓縮後解壓寫入系統根目錄 → 永遠用相對路徑
-C /path . 或 --transform
- 大檔案 (>8GB) 用 gzip/xz 可能受限於 32 位元索引 → 改用 zstd/7z
- 跨系統備份 UID/GID 不匹配 →
--numeric-owner 還原時映射
黃金法則:備份先試還原、壓縮看解壓速度、歸檔用 xz/zstd、傳輸用 zstd/lz4、分發用 zip、加密用 7z/OpenSSL、去重用 borg/restic。