1.8.4 归档压缩与解压(tar、gzip、bzip2、zip)

归档压缩与解压(tar、gzip、bzip2、zip)#

归档压缩用于备份、迁移与节省空间。典型流程是“先归档再压缩”,如 tar + gzip。zip 则一体化完成归档与压缩。

一、原理草图(归档与压缩关系)#

文章图片

二、工具安装与校验#

  • Debian/Ubuntu
sudo apt update
sudo apt install -y tar gzip bzip2 zip unzip xz-utils
  • RHEL/CentOS
sudo yum install -y tar gzip bzip2 zip unzip xz
  • 验证版本
tar --version
gzip --version
bzip2 --version
zip -v | head -n 1

三、tar:归档与压缩(命令解释+完整示例)#

  • 关键参数说明
  • c 创建归档,x 解包,t 列表内容
  • v 输出详细过程,f 指定归档文件名
  • z gzip,j bzip2,J xz
  • C 指定解压目录(避免路径污染)

  • 示例:备份 /etc 与 /var/log 并 gzip 压缩

# 1) 创建目录
mkdir -p /data/backup

# 2) 打包并压缩
tar -czvf /data/backup/sys-$(date +%F).tar.gz /etc /var/log

# 3) 查看归档内容
tar -tf /data/backup/sys-$(date +%F).tar.gz | head -n 5
  • 示例:解压到指定目录
mkdir -p /data/restore
tar -xzvf /data/backup/sys-$(date +%F).tar.gz -C /data/restore
  • 示例:仅归档(不压缩)
tar -cvf /data/backup/sys.tar /etc /var/log

四、gzip / bzip2:单文件压缩#

  • gzip
# 压缩(会替换原文件)
gzip /var/log/messages

# 解压
gunzip /var/log/messages.gz

# 保留原文件
gzip -c /var/log/messages > /var/log/messages.gz
  • bzip2(更高压缩率)
# 压缩
bzip2 /var/log/messages

# 解压
bunzip2 /var/log/messages.bz2

# 保留原文件
bzip2 -c /var/log/messages > /var/log/messages.bz2

五、zip / unzip:跨平台传输#

# 压缩目录(-r 递归)
zip -r /data/backup/etc.zip /etc

# 查看内容
unzip -l /data/backup/etc.zip | head -n 5

# 解压到指定目录
unzip /data/backup/etc.zip -d /data/restore

六、常见排错与定位#

  • **错误:tar: Removing leading /' from member names** 解释:tar 为避免解压覆盖根目录,自动去除绝对路径前缀。 处理:无需处理;如需保留,使用-P`(谨慎)。
tar -czvf /data/backup/etc.tar.gz -P /etc
  • 错误:gzip: stdin: not in gzip format
    解释:文件不是 gzip 格式或后缀误导。
    处理:先判断真实格式再选择解压。
file backup.tar.gz
  • 解压后权限变化
    处理:使用 -p 保留原权限(以 root 解压)。
tar -xzvpf backup.tar.gz -C /data/restore
  • zip 解压乱码(编码问题)
    处理:指定编码或使用 unzip -O
unzip -O GBK backup.zip -d /data/restore

七、生产实践建议#

  • 备份优先使用 tar + gzip(兼容性好、速度快)。
  • 大文件归档后生成校验值,确保传输完整性。
md5sum /data/backup/sys-$(date +%F).tar.gz > /data/backup/sys-$(date +%F).md5
md5sum -c /data/backup/sys-$(date +%F).md5

八、练习(可直接执行)#

  1. /etc/var/log 打包为 backup.tar.gz,并解压到 /tmp/restore
  2. /var/log/messages 分别使用 gzip 与 bzip2 压缩,比较大小(ls -lh)。
  3. 使用 zip 压缩 /etc,并验证压缩包内容列表。
  4. 生成归档的 md5 校验并验证正确性。