13 压缩与解压

学习目标

  • 能打包目录。
  • 能压缩和解压常见 .tar.gz、.gz、.zip 文件。
  • 能区分打包和压缩。

命令总览

命令用途含义基本用法例子
tar打包和解包tape archive,常用于 .tar、.tar.gztar [选项] 包名 路径tar -czf archive.tar.gz folder/
gzipgzip 压缩将单个文件压缩为 .gzgzip 文件gzip app.log
gunzipgzip 解压解压 .gz 文件gunzip 文件.gzgunzip app.log.gz
zipzip 压缩创建 .zip 压缩包zip [选项] 包名 路径zip -r archive.zip folder/
unzipzip 解压解压 .zip 文件unzip 压缩包unzip archive.zip

常用场景

把目录打成 .tar.gz:

tar -czf project.tar.gz -- project/

解压 .tar.gz:

mkdir -- extract-target
tar -xzf project.tar.gz -C extract-target

查看压缩包内容但不解压:

tar -tzf project.tar.gz

压缩和解压单个 gzip 文件:

gzip app.log
gunzip app.log.gz

在唯一临时目录创建 zip,并解压到新空目录:

zip_lab=$(mktemp -d "${TMPDIR:-/tmp}/zip-lab.XXXXXX") || exit 1
if [ ! -O "$zip_lab" ] || [ -L "$zip_lab" ]; then
  printf 'zip lab ownership or symlink check failed\n' >&2
  exit 1
fi
mkdir -- "$zip_lab/project"
printf 'fixture\n' > "$zip_lab/project/README.txt"
(cd -- "$zip_lab" && zip -rq project.zip project) || exit 1
unzip -l "$zip_lab/project.zip"
zip_dest=$(mktemp -d "$zip_lab/extract.XXXXXX") || exit 1
unzip -q "$zip_lab/project.zip" -d "$zip_dest"
find "$zip_dest" -maxdepth 2 -print

新手注意

  • tar 常见参数:c 创建,x 解包,t 查看,z 使用 gzip,f 指定文件名。
  • .tar 主要是打包,.gz 主要是压缩,.tar.gz 是先打包再压缩。
  • gzip file 默认会把原文件变成 file.gz,原文件不再保留。
  • 解压前可以用 tar -tzf 或 unzip -l 先看里面有什么。
  • 解压未知压缩包时建议先放进空目录,避免文件散落或覆盖已有文件。

不可信归档的额外风险

“先列清单 + 新空目录”只是最低起点。恶意归档还可能包含绝对路径、.. 路径穿越、符号/硬链接、特殊文件、异常权限或所有者信息。不要以 root 解压未知归档,也不要直接解压到项目、家目录或系统路径。

GNU tar 的受控检查流程:

archive=$(realpath -e -- project.tar.gz) || exit 1
tar -tzf "$archive"
dest=$(mktemp -d "${TMPDIR:-/tmp}/archive-lab.XXXXXX") || exit 1
dest_real=$(realpath -e -- "$dest") || exit 1
printf 'archive=%s\ndestination=%s\n' "$archive" "$dest_real"
tar --extract --gzip --file="$archive" \
  --directory="$dest_real" \
  --no-same-owner \
  --no-same-permissions
find "$dest_real" -mindepth 1 -maxdepth 3 -print

仍需人工检查清单中的绝对路径、.. 和链接意图。GNU tar、macOS 常见 bsdtar/libarchive 的选项与默认保护不同;按实际实现查手册。

练习与掌握检查

在实验目录创建两个小文本文件,打包、列清单、解压到全新目录并用 cmp 对比。能解释打包与压缩、原文件是否保留、解压目标和不可信归档边界才算完成。

参考资料