tar 是 Linux 最核心的歸檔工具,能將整個目錄樹打包成單一檔案,並配合 gzip、bzip2、xz 等演算法壓縮。本文系統整理常用參數、八大實戰範例,並深入解析絕對路徑與權限保留的陷阱,助您從入門到精通。
| 參數 | 功能 | 備註 |
|---|---|---|
-c | 建立新歸檔 | create |
-x | 解開歸檔 | extract |
-t | 列出歸檔內容 | list |
-z | gzip 壓縮/解壓 | .tar.gz / .tgz |
-j | bzip2 壓縮/解壓 | .tar.bz2 |
-J | xz 壓縮/解壓 | .tar.xz (現代推薦) |
-v | 顯示處理檔案 | 避免背景執行使用 |
-f | 指定歸檔檔名 | 須緊接檔名,勿夾帶其他參數 |
-p | 保留原始權限/屬性 | 權限不隨使用者變動 |
-P | 保留絕對路徑 | 預設會移除開頭 / |
-N DATE | 僅打包比日期新的檔 | 格式 yyyy/mm/dd |
--exclude PATTERN | 排除符合模式的檔案 | 可重複使用 |
鐵律:c、x、t 三者必須且只能擇一出現。
# 僅打包
tar -cvf /tmp/etc.tar /etc
# gzip 壓縮(最常用)
tar -zcvf /tmp/etc.tar.gz /etc
# bzip2 壓縮(壓縮率較高)
tar -jcvf /tmp/etc.tar.bz2 /etc
執行時會出現 tar: Removing leading '/' from member names 警告,見後文「絕對路徑陷阱」。
tar -ztvf /tmp/etc.tar.gz
因使用 gzip,故須加 -z;若為 bzip2 則改 -j。
cd /usr/local/src
tar -zxvf /tmp/etc.tar.gz
# 解壓後檔案位於 /usr/local/src/etc
cd /tmp
tar -zxvf /tmp/etc.tar.gz etc/passwd
# 注意:歸檔內路徑不含開頭 /
tar -zcvpf /tmp/etc.tar.gz /etc
-p 確保還原時 uid/gid/mode 不變,備份系統配置必加。
tar -N '2005/06/01' -zcvf home.tar.gz /home
tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc
cd /tmp
tar -cvf - /etc | tar -xvf -
# 相當於 cp -r /etc /tmp,但保留更完整屬性
- 代表標準輸出/輸入,配合管線 | 實現「邊讀邊寫」。
使用 tar -cvf /tmp/etc.tar /etc 時,歸檔內會將 /etc 記錄為 etc(移除開頭 /)。這是安全機制:防止惡意歸檔在解壓時覆蓋系統關鍵目錄(如 /etc/passwd)。
-P(大寫):tar -cvPf /tmp/etc.tar /etc-P 才會還原至原絕對路徑-p(小寫)預設解壓時,檔案擁有者會變為執行解壓的使用者。加上 -p 可保留原始 uid/gid/mode/ACL/擴充屬性,系統備份、遷移時不可或缺。
-J (xz) 壓縮:壓縮率最佳、解壓速度尚可,tar -Jcvf data.tar.xz /datapv 顯示進度:tar -cvf - /data | pv | gzip > data.tar.gztar -I 'pigz -p4' -cvf data.tar.gz /datatar -tvf backup.tar.gz >/dev/null && echo OK