在 Linux 系统中,文件和目录的压缩是一项常见且重要的操作。无论是为了节省存储空间、便于文件传输,还是进行备份管理,掌握压缩技术都能极大地提升工作效率。
Linux 中常用的压缩工具
1. tar:打包利器
tar(Tape Archive)是 Linux 中最常用的打包工具,用于将多个文件或目录合并成一个文件(称为归档文件)。tar 本身不提供压缩功能,但通常与压缩工具(如 gzip、bzip2、xz)结合使用。
常用选项
- -c:创建新的归档文件。
- -x:解压归档文件。
- -f:指定归档文件名。
- -v:显示操作过程(详细模式)。
- -z:通过 gzip 压缩或解压。
- -j:通过 bzip2 压缩或解压。
- -J:通过 xz 压缩或解压。
打包示例
将目录 my_folder 打包成 archive.tar:
tar -cvf archive.tar my_folder
压缩示例
将 my_folder 打包并用 gzip 压缩为 archive.tar.gz:
tar -zcvf archive.tar.gz my_folder
将 my_folder 打包并用 bzip2 压缩为 archive.tar.bz2:
tar -jcvf archive.tar.bz2 my_folder
将 my_folder 打包并用 xz 压缩为 archive.tar.xz:
tar -Jcvf archive.tar.xz my_folder
解压示例
解压 archive.tar.gz 到当前目录:
tar -zxvf archive.tar.gz
解压 archive.tar.bz2 到指定目录 /tmp:
tar -jxvf archive.tar.bz2 -C /tmp
解压 archive.tar.xz:
tar -Jxvf archive.tar.xz
查看归档内容
不解压查看 archive.tar.gz 的内容:
tar -ztvf archive.tar.gz
高级用法
- 追加文件到归档:
tar -rvf archive.tar new_file.txt
注意:追加仅适用于未压缩的 .tar 文件。
- 排除特定文件或目录:
打包 my_folder 但排除 .git 目录:
tar -zcvf archive.tar.gz --exclude=.git my_folder
- 增量备份:
第一次备份:
tar -zcvf backup.tar.gz --listed-incremental=snapshot.snar my_folder
后续增量备份:
tar -zcvf backup_incremental.tar.gz --listed-incremental=snapshot.snar my_folder
2. gzip:高效压缩
gzip 是最常用的压缩工具,压缩比适中,速度快,常与 tar 结合使用。
压缩文件
压缩 file.txt 为 file.txt.gz:
gzip file.txt
解压文件
解压 file.txt.gz:
gunzip file.txt.gz
保留原始文件
压缩时保留原始文件:
gzip -c file.txt > file.txt.gz
设置压缩级别
gzip 支持 1 到 9 的压缩级别,1 为最快但压缩比低,9 为最慢但压缩比高:
gzip -9 file.txt
查看压缩文件内容
不解压查看 file.txt.gz 的内容:
zcat file.txt.gz
3. bzip2:高压缩比
bzip2 提供比 gzip 更高的压缩比,但压缩速度较慢。
压缩文件
压缩 file.txt 为 file.txt.bz2:
bzip2 file.txt
解压文件
解压 file.txt.bz2:
bunzip2 file.txt.bz2
保留原始文件
压缩时保留原始文件:
bzip2 -c file.txt > file.txt.bz2
查看压缩文件内容
不解压查看 file.txt.bz2 的内容:
bzcat file.txt.bz2
4. xz:极高压缩比
xz 是现代压缩工具,压缩比极高,适合需要最大程度节省空间的场景。
压缩文件
压缩 file.txt 为 file.txt.xz:
xz file.txt
解压文件
解压 file.txt.xz:
unxz file.txt.xz
保留原始文件
压缩时保留原始文件:
xz -c file.txt > file.txt.xz
设置压缩级别
与 gzip 类似,xz 支持 1 到 9 的压缩级别:
xz -9 file.txt
5. zip:跨平台兼容
zip 是一种跨平台兼容的压缩格式,适合与 Windows 或 macOS 用户共享文件。
压缩文件或目录
压缩 my_folder 为 archive.zip:
zip -r archive.zip my_folder
解压文件
解压 archive.zip 到当前目录:
unzip archive.zip
解压到指定目录:
unzip archive.zip -d /tmp
查看压缩文件内容
不解压查看 archive.zip 的内容:
unzip -l archive.zip
设置压缩级别
zip 支持 0 到 9 的压缩级别,0 为不压缩,9 为最高压缩:
zip -9 -r archive.zip my_folder
加密压缩
为压缩文件设置密码:
zip -e -r archive.zip my_folder
压缩工具对比
工具 | 压缩比 | 压缩速度 | 解压速度 | 适用场景 |
gzip | 中等 | 快 | 快 | 日常压缩,速度优先 |
bzip2 | 高 | 慢 | 中等 | 需要较高压缩比 |
xz | 极高 | 很慢 | 慢 | 追求最小文件大小 |
zip | 中等 | 中等 | 中等 | 跨平台共享 |
常见问题
1. 压缩文件过大怎么办?
- 选择高压缩比工具:尝试 xz 或 bzip2 替代 gzip。
- 分卷压缩:对超大文件,使用 zip 的分卷功能:
zip -r -s 100m archive.zip my_folder
上述命令将 my_folder 压缩为多个 100MB 的分卷文件。
2. 解压时提示 “权限不足”?
确保有目标目录的写权限,或者以 sudo 运行命令:
sudo tar -zxvf archive.tar.gz -C /target/directory
3. 压缩文件损坏怎么办?
尝试修复损坏的压缩文件:
- 对于 zip 文件:
zip -F damaged.zip --out repaired.zip
- 对于 tar 文件,尝试忽略错误继续解压:
tar -zxvf damaged.tar.gz --ignore-zeros
4. 如何快速比较压缩前后的文件大小?
使用 du 命令:
du -sh my_folder
du -sh archive.tar.gz
进阶技巧
1. 并行压缩
对于多核 CPU,可以使用 pigz(并行 gzip)或 pbzip2(并行 bzip2)加速压缩:
tar -c my_folder | pigz > archive.tar.gz
安装 pigz:
sudo apt install pigz
2. 压缩后直接上传到云存储
将压缩文件直接上传到 AWS S3:
tar -zcvf - my_folder | aws s3 cp - s3://my-bucket/backup.tar.gz
3. 检查压缩文件的完整性
对于 zip 文件:
unzip -t archive.zip
对于 tar.gz 文件,解压到 /dev/null 测试:
tar -zxvf archive.tar.gz -O > /dev/null