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