Linux tar 命令完全指南:文件归档与压缩

Linux tar 命令完全指南:文件归档与压缩

Someone Lv5

前言

在 Linux 系统中,文件归档和压缩是最基础也是最常用的操作之一。tar 命令(Tape ARchive)自 Unix 早期就已存在,至今仍是系统管理员和开发者必不可少的工具。本文将系统讲解 tar 命令的方方面面,从基础用法到高级技巧,帮助你彻底掌握文件归档与压缩。

一、tar 的核心概念

tar 最初设计用于将数据写入磁带设备(Tape ARchive 的名称也由此而来),如今已成为创建和解包归档文件的标准工具。它的工作原理是将多个文件和目录打包成一个单一的归档文件(通常称为 tarball),然后可以配合压缩工具进一步缩小体积。

压缩格式的选择

tar 本身只负责打包,不执行压缩。压缩由外部工具完成,tar 通过参数调用它们:

压缩格式tar 参数扩展名压缩率速度适用场景
无压缩.tar-最快仅打包不压缩
gzip-z.tar.gz / .tgz中等日常使用、分发包
bzip2-j.tar.bz2 / .tbz2较高较慢需要更高压缩率时
xz-J.tar.xz最高归档备份、最小体积
zstd--zstd.tar.zst极快需要平衡速度和压缩率

经验建议:日常使用推荐 gzip(-z),兼具速度和可接受的压缩率;归档备份推荐 xz(-J),体积最小;大规模部署包推荐 zstd(–zstd),解压速度极快。

二、基础用法

2.1 创建归档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 基本语法:tar -cf 归档文件名 要打包的文件/目录
tar -cf archive.tar /path/to/dir

# 使用 gzip 压缩
tar -czf archive.tar.gz /path/to/dir

# 使用 bzip2 压缩
tar -cjf archive.tar.bz2 /path/to/dir

# 使用 xz 压缩
tar -cJf archive.tar.xz /path/to/dir

# 使用 zstd 压缩
tar -c --zstd -f archive.tar.zst /path/to/dir

参数说明:

  • -c:创建归档(create)
  • -f:指定归档文件名(file)
  • -z / -j / -J:分别使用 gzip / bzip2 / xz 压缩

2.2 解包归档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 解包 .tar
tar -xf archive.tar

# 解包 .tar.gz
tar -xzf archive.tar.gz

# 解包 .tar.bz2
tar -xjf archive.tar.bz2

# 解包 .tar.xz
tar -xJf archive.tar.xz

# 解包到指定目录
tar -xzf archive.tar.gz -C /target/directory

参数说明:

  • -x:解包(extract)
  • -C:切换到指定目录(一般用于指定解包目标位置)

2.3 查看归档内容

1
2
3
4
5
# 列出归档中的文件列表
tar -tf archive.tar.gz

# 查看详细信息(权限、大小、时间等)
tar -tvf archive.tar.gz

-t 参数仅列出内容而不解包,非常适合快速预览归档结构。

三、日常实战场景

3.1 备份网站目录

1
2
3
4
5
6
7
8
9
# 创建带时间戳的备份
tar -czf "backup-$(date +%Y%m%d_%H%M%S).tar.gz" /var/www/html

# 排除缓存目录和日志文件
tar -czf website-backup.tar.gz \
--exclude="cache" \
--exclude="logs" \
--exclude="*.log" \
/var/www/html

3.2 打包多个文件/目录

1
2
3
4
5
6
# 打包不连续的多个目录和文件
tar -czf config-backup.tar.gz \
/etc/nginx/nginx.conf \
/etc/nginx/sites-available/ \
/var/www/html \
~/.ssh/config

3.3 向已有归档追加文件

注意:只对未压缩的 .tar 文件有效,压缩后的归档无法直接追加。

1
2
3
4
5
6
7
8
# 创建未压缩归档
tar -cf archive.tar dir1 dir2

# 追加文件
tar -rf archive.tar newfile.txt

# 验证追加结果
tar -tf archive.tar

3.4 从归档中提取特定文件

1
2
3
4
5
6
7
8
# 提取单个文件
tar -xzf archive.tar.gz path/to/specific/file.txt

# 提取多个文件(使用通配符)
tar -xzf archive.tar.gz --wildcards '*.conf'

# 提取目录
tar -xzf archive.tar.gz etc/nginx/

3.5 增量备份

1
2
3
4
5
6
7
8
9
# 创建快照文件来跟踪已备份的文件
tar -czf full-backup.tar.gz \
--listed-incremental=backup.snar \
/data/documents

# 基于快照做增量备份(只备份新增/修改的文件)
tar -czf incremental-backup.tar.gz \
--listed-incremental=backup.snar \
/data/documents

.snar 文件记录了文件的元数据(mtime、大小等),第二次运行时 tar 会自动比较,只打包有变化的文件。

四、高级用法

4.1 保留文件属性

1
2
3
4
5
6
# 保留权限、所有权、时间戳等元数据
tar -czpf important-backup.tar.gz /data

# 保留 ACL 和 SELinux 上下文
tar -czp --acls --xattrs --selinux \
-f full-system-backup.tar.gz /etc

-p(或 --preserve-permissions)在创建和提取时保留文件权限,--acls--xattrs--selinux 分别保留扩展属性。

4.2 通过 SSH 远程归档

1
2
3
4
5
6
7
8
# 在远程服务器上创建归档并下载到本地
ssh user@server "tar -czf - /var/log" > remote-logs.tar.gz

# 本地创建归档并直接推送到远程
tar -czf - /data | ssh user@server "cat > /backup/data.tar.gz"

# 远程解包到本地(管道传递)
ssh user@server "cat /backup/data.tar.gz" | tar -xzf - -C /restore

这里的 - 表示标准输入/输出,使 tar 可以作为管道中的链接。

4.3 分割大归档

当归档文件太大无法写入单个存储介质时,可以使用 split 分割:

1
2
3
4
5
6
7
8
9
10
11
12
# 创建未压缩的大归档
tar -cf large-archive.tar /data/photos

# 分割为 1GB 大小的块
split -b 1G large-archive.tar large-archive.tar.part

# 还原时先合并再解包
cat large-archive.tar.part* > large-archive.tar
tar -xf large-archive.tar

# 或者直接通过管道操作(节省磁盘空间)
tar -czf - /data/photos | split -b 1G - backup.tar.gz.part

4.4 检验归档完整性

1
2
3
4
5
# 验证归档文件是否损坏
tar -tzf archive.tar.gz > /dev/null

# 如果无错误输出,则归档完整
# 有错误时会显示具体哪个文件出问题

更可靠的方式是配合校验和:

1
2
3
4
5
# 创建归档时同时生成校验和
tar -czf data.tar.gz /data && sha256sum data.tar.gz > data.tar.gz.sha256

# 验证
sha256sum -c data.tar.gz.sha256

4.5 排除与包含模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 多模式排除
tar -czf project-backup.tar.gz \
--exclude="node_modules" \
--exclude=".git" \
--exclude="__pycache__" \
--exclude="*.pyc" \
--exclude=".DS_Store" \
/path/to/project

# 使用排除文件列表
echo "node_modules" > exclude.txt
echo ".git" >> exclude.txt
echo "*.log" >> exclude.txt
tar -czf project.tar.gz -X exclude.txt /path/to/project

# 只包含指定模式的文件
tar -czf js-files.tar.gz --include='*.js' /path/to/project

五、常用选项速查表

选项长选项作用
-c--create创建新归档
-x--extract解包归档
-t--list列出归档内容
-f--file指定归档文件名(或设备)
-v--verbose显示详细处理信息
-z--gzip通过 gzip 压缩/解压
-j--bzip2通过 bzip2 压缩/解压
-J--xz通过 xz 压缩/解压
--zstd通过 zstd 压缩/解压
-p--preserve-permissions保留文件权限
-r--append追加文件到归档末尾
-u--update仅追加比归档中更新的文件
-C--directory切换到指定目录
--exclude排除匹配模式的文件
-X--exclude-from从文件中读取排除模式
--include只包含匹配模式的文件
--delete从归档中删除文件(不适用于压缩归档)
--acls保留 ACL 权限
--xattrs保留扩展属性
--listed-incremental创建/使用增量快照
--wildcards在文件名中使用通配符
-d--diff比较归档与文件系统的差异

六、实际案例:完整备份脚本

以下是一个实用的每日网站备份脚本,综合了本文的多种技巧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/bin/bash
# website-backup.sh - 网站每日备份脚本

BACKUP_DIR="/data/backups"
SITE_DIR="/var/www/html"
DB_NAME="myblog"
DB_USER="backup"
DB_PASS="your_password"
RETENTION_DAYS=30

# 创建备份目录
mkdir -p "${BACKUP_DIR}"

# 日期戳
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/site_backup_${DATE}.tar.gz"

echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始备份..."

# 1. 导出数据库
mysqldump -u"${DB_USER}" -p"${DB_PASS}" "${DB_NAME}" > /tmp/site_db.sql
if [ $? -ne 0 ]; then
echo "ERROR: 数据库导出失败!"
exit 1
fi

# 2. 打包网站文件 + 数据库
tar -czf "${BACKUP_FILE}" \
--exclude="cache" \
--exclude=".git" \
-C / tmp/site_db.sql \
-C / var/www/html

# 3. 清理临时文件
rm -f /tmp/site_db.sql

# 4. 验证归档完整性
tar -tzf "${BACKUP_FILE}" > /dev/null 2>&1
if [ $? -eq 0 ]; then
BACKUP_SIZE=$(du -h "${BACKUP_FILE}" | cut -f1)
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 备份完成:${BACKUP_FILE} (${BACKUP_SIZE})"
else
echo "ERROR: 备份文件损坏!"
exit 1
fi

# 5. 删除超过保留天数的旧备份
find "${BACKUP_DIR}" -name "site_backup_*.tar.gz" -mtime +${RETENTION_DAYS} -delete

echo "[$(date '+%Y-%m-%d %H:%M:%S')] 清理完成,保留最近 ${RETENTION_DAYS} 天的备份。"

七、常见问题排查

问题原因解决方案
tar: Removing leading `/' from member names使用了绝对路径使用 -C / 切换到根目录再指定相对路径,如 tar -czf backup.tar.gz -C / var/www/html
gzip: stdin: unexpected end of file归档文件被截断或损坏重新下载或创建归档,使用 sha256sum 校验
Can't open 'file': Permission denied解包时没有写入权限使用 sudo 或解包到有权限的目录
Cannot open: No such file or directory归档文件路径不正确检查文件路径,使用 ls -la 确认
tar: Error is not recoverable; exiting now归档文件严重损坏尝试 tar -xzf 时加 --ignore-zeros 跳过坏块
归档解包后文件散落四处打包时使用了绝对路径或未在目录内打包打包前 cd 到目标目录上层,使用相对路径

八、安全最佳实践

  1. 校验完整性:归档操作后始终执行 tar -tzf file.tar.gz > /dev/null 验证,并配合 SHA256 校验和
  2. 敏感数据加密:归档包含敏感信息时,结合 GPG 加密:
    1
    2
    3
    tar -czf - /data/secrets | gpg -c > secrets.tar.gz.gpg
    # 解密
    gpg -d secrets.tar.gz.gpg | tar -xzf -
  3. 避免根目录解包覆盖:解包前先用 tar -tf 查看内容,确认是否有顶层级目录
  4. 保留文件属性:生产环境备份始终使用 -p 参数保留权限
  5. 定期验证备份可恢复性:每月至少执行一次完整的恢复演练

九、总结

tar 命令是 Linux 系统管理的瑞士军刀。掌握了本文涵盖的内容,你就能够:

  • 使用 4 种主流压缩格式创建和解包归档
  • 灵活地包含/排除特定文件
  • 通过 SSH 远程归档和传输
  • 创建增量备份策略
  • 编写完整的备份脚本
  • 排查常见的归档问题

核心口诀c 创建、x 解包、t 查看、f 指定文件名、z/j/J/--zstd 选压缩器、v 看详情、C 指定目标目录。

将这些结合到日常工作中,文件管理效率将大幅提升。


本文由AI辅助生成,内容仅供参考

  • 标题: Linux tar 命令完全指南:文件归档与压缩
  • 作者: Someone
  • 创建于 : 2026-06-09 18:30:00
  • 更新于 : 2026-06-18 08:39:57
  • 链接: https://demo-blog.qusite.cn/2026-06-09-tar-command-guide/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。