How to Compress and Decompress Files

Table of Contents

1. tar(支持 gz、bz2 等格式)

tar 支持打包和解包:
-c 打包选项
-x 解包选项

tar 支持第三方压缩工具:
-z 通过工具 gzip 的支持进行压缩/解压缩,此时文件名一般为 *.tar.gz
-j 通过工具 bzip2 的支持进行压缩/解压缩,此时文件名一般为 *.tar.bz2
-J 通过工具 xz 的支持进行压缩/解压缩,此时文件名一般为 *.tar.xz
-Z 通过工具 compress (很可能系统没有内置这个工具)的支持进行压缩/解压缩,此时文件名一般为 *.Z

打包实例:

$ tar -cf file.tar file              # 打包 file 为 file.tar
$ tar -czf file.tar.gz file          # 打包 file 为 file.tar.gz
$ tar -cjf file.tar.bz2 file         # 打包 file 为 file.tar.bz2
$ tar -cJf file.tar.xz file          # 打包 file 为 file.tar.xz

相应的解包实例:

$ tar -xf file.tar                   # 把 file.tar 解压
$ tar -xzf file.tar.gz               # 把 file.tar.gz 解压
$ tar -xjf file.tar.bz2              # 把 file.tar.bz2 解压
$ tar -xJf file.tar.xz               # 把 file.tar.xz 解压

1.1. 打包时忽略某些文件

使用选项 --exclude 可以在打包时排除某些文件。比如,排除所有 .o 文件:

$ tar -cf src.tar --exclude='*.o' src     # src 及其子目录中的 .o 文件不会被打包

下面例子将在打包 src.tar 时排除整个子目录 src/sub1:

$ tar -cf src.tar --exclude=src/sub1 src  # 目录 src/sub1 中的所有文件不会被打包

1.2. 仅解压指定文件

可以仅解压压缩包中的某个文件(或文件夹)。把要解压的文件(或文件夹)直接写在压缩文件名后面即可。

假设 1.tar.gz 中有文件 usr/share/pixmaps/1.png,只解压这个文件的命令如下:

$ tar -zxvf 1.tar.gz usr/share/pixmaps/1.png

1.3. 解压到指定目录

使用 -C 选项可以解压到指定目录(目录必须事先存在),如:

$ tar -zxvf 1.tar.gz -C /path/to/extract

2. zip 格式

2.1. 查看 zip 中的文件列表(zipinfo)

查看压缩文件的文件列表,有下面两种方法:

$ unzip -l filename.zip
$ zipinfo filename.zip

2.2. 解压 zip

解压全部文件:

$ unzip -x filename.zip               # 解压到当前文件夹
$ unzip filename.zip                  # 同上
$ unzip filename.zip -d dir1          # 解压到 dir1 中

2.2.1. 仅解压指定文件

仅解压 zip 文件中的指定文件:

$ unzip filename.zip test/1.txt

仅解压 filename.zip 中子目录 test 中的 1.txt,如果 filename.zip 中不存在 test/1.txt,则会报错。

2.2.2. 解压时指定字符集

在 Windows 下压缩的文件名中有中文的 zip 文件,在 Linux 下解压时会出现乱码。这时可以指定字符集(下文中的 GBK 换成 CP936 或 GB18030 都行),就能正确解压含有中文的 zip 文件了。

$ unzip -O GBK file.zip                # 指定编码解压文件

注:有些 unzip 不支持 -O 选项。在支持 -O 的 unzip 中,查看 man unzip 也可能找不到关于 -O 选项的说明。

2.3. 压缩 zip

压缩(或更新)文件:

$ zip file1.zip file1

把 file1 压缩为 file1.zip(如果 file1.zip 存在,则只是更新里面的对应文件)

压缩(或更新)文件夹:

$ zip -r files.zip file1 file2 file3 dir/

把文件 file1,file2,file3 和文件夹 dir 全部打包到 files.zip 中(如果 file.zip 存在,则只是更新里面的对应文件)。 -r 选项指定你想递归地包括所有包括在 dir 目录中的文件。

默认地,使用 zip 压缩文件(夹)时会把符号链接替换为所链接的文件,如果想在压缩时保留符号链接,则需要指定选项 -y 或者 --symlinks

2.3.1. 排除某个文件夹

使用 -x 选项可以在压缩时排除指定文件夹,如下面命令在压缩时将排除 node_modules 和 dist 文件夹:

$ zip -r dir.zip dir/ -x '*/node_modules/*' '*/dist/*'

3. 7z 格式

安装 7z 相应软件:

$ apt-get install p7zip        # 安装 7zr(仅安装解压工具)
$ apt-get install p7zip-full   # 安装 7zr 和 7z(同时安装压缩/解压工具)

下面是 7z 格式压缩/解压实例:

$ 7z a file1.7z file1          # 把 file1 压缩为 file1.7z
$ 7zr x file1.7z               # 解压 file1.7z

4. xz 格式

xz 采用 LZMA 算法(前面介绍的 7z 也采用的这类算法)进行压缩。压缩/解压实例如下:

$ xz file1                     # 把 file1 压缩为 file1.xz,会删除 file1
$ unxz file1.xz                # 把 file1.xz 解压为 file1,会删除 file1.xz
$ xz -d file1.xz               # 同上,把 file1.xz 解压为 file1,会删除 file1.xz

xz 不支持对整个目录进行压缩,可以先使用 tar 打包目录为文件后,再使用 xz 进行压缩。或者直接用 tar 一次完成:

$ tar -cJf dir1.tar.xz  dir1   # 把目录 dir1 打包为 tar 文件后,再使用 xz 压缩
$ tar -xJf dir1.tar.xz         # 解压 dir1.tar.xz

在压缩/解压过程中,默认会删除源文件,如果想保留原文件,可以指定选项 -k ,如:

$ unxz -k file1.xz             # 解压 file1.xz 时,会保留 file1.xz

Author: cig01

Created: <2011-06-06 Mon>

Last updated: <2020-06-16 Tue>

Creator: Emacs 27.1 (Org mode 9.4)