tar 封存完全指南:壓縮、備份與恢復
在 Linux 系統管理與日常開發中,tar(Tape Archive)無疑是最核心的工具之一。儘管名稱源自於早期的磁帶備份,但如今它已成為處理檔案打包與壓縮的標準。許多新手常混淆「打包」與「壓縮」的區別,導致在建立備份時效率低落或格式錯誤。本文將深入解析 tar 的運作機制,並提供在 Ubuntu 22.04 / Debian 12 環境下實用的操作範例。
核心概念:打包 vs. 壓縮
要精通 tar,首先需釐清兩個概念:
- 打包(Archiving):將多個檔案或目錄合併成單一檔案,便於傳輸與管理。
tar本身主要負責此步驟,產生的副檔名通常為.tar。 - 壓縮(Compression):透過演算法減少檔案佔用的空間。常見的壓縮格式包括
gzip(.gz)、bzip2(.bz2)、xz(.xz) 等。
tar 指令的強大之處在於它能同時執行這兩項任務,並支援多種壓縮格式。
常用選項解析
在撰寫指令前,先了解幾個關鍵選項:
-c(create):建立新的封存檔。-x(extract):從封存檔中還原檔案。-f(file):指定封存檔的名稱。注意:-f後面必須緊接檔名,且通常放在選項最後。-v(verbose):顯示處理過程的詳細資訊(可選,便於除錯)。-z(gzip):使用 gzip 壓縮或解壓縮。-j(bzip2):使用 bzip2 壓縮或解壓縮。-J(xz):使用 xz 壓縮或解壓縮(壓縮率最高,但速度較慢)。-t(list):列出封存檔內容,不進行解壓縮。
實務範例:建立與壓縮
假設我們有一個名為 project_docs 的目錄,希望將其打包並壓縮為 backup.tar.gz。
# 建立目錄並放入測試檔案
mkdir -p project_docs
echo "Sample content" > project_docs/readme.txt
# 使用 gzip 壓縮打包
tar -czvf backup.tar.gz project_docs/
指令輸出示範:
project_docs/
project_docs/readme.txt
若希望檔案更小以節省儲存空間,可改用 xz 格式(雖然壓縮時間較長):
tar -cJvf backup.tar.xz project_docs/
實務範例:檢查與恢復
在進行備份還原前,檢查封存檔內容是良好的習慣。這能確認檔案結構是否符合預期,且無需耗費解壓縮的時間。
# 列出封存檔內容
tar -tzvf backup.tar.gz
指令輸出示範:
drwxr-xr-x user/group 0 2023-10-27 10:00 project_docs/
-rw-r--r-- user/group 15 2023-10-27 10:00 project_docs/readme.txt
當需要將備份還原至當前目錄時,使用 -x 選項。若希望還原時保留檔案的原始權限與時間戳記,建議加上 -p 選項(雖然在一般使用者間通常預設會保留)。
# 建立測試目錄模擬還原環境
mkdir restore_test
cd restore_test
# 還原檔案
tar -xzvf ../backup.tar.gz
指令輸出示範:
project_docs/
project_docs/readme.txt
進階技巧:排除特定檔案
在備份專案時,我們通常不需要備份 node_modules、.git 或暫存檔案。tar 提供了 --exclude 參數來輕鬆過濾。
# 備份時排除 .git 目錄與 .log 結尾的檔案
tar -czvf backup_excluded.tar.gz project_docs/ --exclude='.git' --exclude='*.log'
常見問題與注意事項
-
權限問題(Permission Denied) 當使用
root權限建立備份,並嘗試在一般使用者環境下還原時,可能會遇到權限錯誤。建議在還原時使用-p選項以保留原始權限,或在一般使用者環境下建立備份,避免權限錯置。若必須還原系統級備份,請務必使用sudo tar -xvf ...。 -
壓縮格式的選擇 不要盲目追求最高的壓縮率。
gzip(.gz) 在壓縮速度與檔案大小之間取得了最佳平衡,是大多數 Linux 發行版(如 Ubuntu/Debian)的預設選擇。xz(.xz) 適合長期冷備份(Cold Storage),而bzip2(.bz2) 則介於兩者之間。在頻寬受限的環境下,優先考慮壓縮速度;在儲存空間緊張時,優先考慮壓縮率。
小結
tar 是 Linux 系統管理中不可或缺的工具。透過掌握 -c、-x、-f 等核心選項,並靈活搭配 gzip、bzip2 或 xz 壓縮演算法,您可以輕鬆應對各種備份與傳輸需求。記住,建立備份後務必進行還原測試,並善用 --exclude 排除不必要的檔案,以確保備份的精確性與效率。