13 压缩与解压
学习目标
- 能打包目录。
- 能压缩和解压常见
.tar.gz、.gz、.zip文件。 - 能区分打包和压缩。
命令总览
| 命令 | 用途 | 含义 | 基本用法 | 例子 |
|---|---|---|---|---|
tar | 打包和解包 | tape archive,常用于 .tar、.tar.gz | tar [选项] 包名 路径 | tar -czf archive.tar.gz folder/ |
gzip | gzip 压缩 | 将单个文件压缩为 .gz | gzip 文件 | gzip app.log |
gunzip | gzip 解压 | 解压 .gz 文件 | gunzip 文件.gz | gunzip app.log.gz |
zip | zip 压缩 | 创建 .zip 压缩包 | zip [选项] 包名 路径 | zip -r archive.zip folder/ |
unzip | zip 解压 | 解压 .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 对比。能解释打包与压缩、原文件是否保留、解压目标和不可信归档边界才算完成。