归档与压缩 Linux 文件或目录
🗂 | 查看 Linux 专题可浏览更多内容
归档与压缩
你也许已经对如 .zip
、.rar
、.7z
这样的压缩文件很熟悉,并可以熟练的使用如 WinZip、WinRAR、BandZip 这样的多功能压缩文件管理工具。
「压缩」就是通过特定的算法来减小计算机文件大小,但你可能还不知道「归档」。
所谓「归档」就是将多个文件和目录组成一个文件的过程。
也就是说这其实是两件事,将多个文件或目录「归档」成一个文件是一回事,而将文件体积进行「压缩」则是另一回事,只是现在许多工具将两件事一气呵成的做到了。
💡 Unix 有一个哲学理念为「只做一件事,并且把它做好!」,也就是说一个工具应该只专注于做一件事。
那么在 Linux 上,归档和压缩是使用什么软件及如何操作的呢?
tar
tar (tape archive) 是类 Unix 系统上最常见最经典的文件归档工具,它最初的用途是备份磁带,当然现在可不仅于此。
打包
1 | tar 参数 归档文件名及路径 被归档文件1 [被归档文件2 ...] |
假设想把当前目录下的 README.md
打包到当前目录下并命名成 Documents.tar
-c
表示创建一个打包文件-f
表示目标文件名
1 | tar -cf Documents.tar README.md |
打包绝对路径时的提示
在压缩打包绝对路径的包的时候可能会遇到一个报错:
1 | tar: Removing leading `/' from member names |
这时候可以使用 -P
参数,且注意这个参数需要在 -f
之前,如:tar -cPf
举个例子,假设想把 /etc
这个目录打包到主目录下,命名为 etc.tar
1 | sudo tar -cPf /home/conners/etc.tar /etc |
添加新文件到归档文件中
例如,将当前目录下的文件 demo.mp3
添加到当前目录下已有的归档文件 music.tar
中
1 | # 使用 -r 参数追加文件 |
查看归档文件中的内容
- 使用
-t
参数查看归档文件中的内容 - 可再加上
-v
参数查看如时间、权限、属主等详细内容
1 | # 使用 -t 查看归档文件中的内容 |
解包
1 | # 在当前目录中解包 <文件名>.tar |
gzip 与 bzip2
gzip 与 gunzip
gzip 程序可以压缩单个或多个文件
1 | gzip <目标文件> |
使用 gzip
命令会使原文件的压缩文件替换原文件。
1 | gzip -d <文件名>.gz |
使用 gzip
的 -d
选项或 gunzip
命令就可以解压指定的 .gz
压缩文件,同时压缩文件会被原文件替换。
❓ 如果使用 gzip 压缩一个目录会发生什么,首先 gzip 会提示这是一个目录,而如果使用
-r
选项,它会递归压缩目录内的文件,但不是将所有文件打包到一起,而是各自压缩,你可以找个目录试试-r
选项。
bzip2 与 bunzip2
bzip2 与 gzip 类似,连使用方法也是
1 | # 使用 bzip2 压缩一个文件 |
bzip2 的用法基本和 gzip 类似(除了 -r
选项)
使用 tar 在打包时连带压缩
在使用 tar 打包时加上 -z
选项就可以在归档时使用 gzip 压缩:
1 | tar -czPf <文件名>.tar.gz <被归档压缩文件> |
而加上 -j
选项可以在归档时使用 bzip2 压缩:
1 | tar -cjPf <文件名>.tar.bz2 <被归档压缩文件> |
使用 tar 解包解压缩
1 | # 在当前目录中解压 .tar.gz 文件 |
同样算法但不同后缀名
其实为了简化和传播, gzip 和 bzip2 还有单后缀名格式。如下:
.tar.gz
> .tgz
.tar.bz2
> .tbz2
更智能的 -a 选项
gzip 的 -z
选项 bzip2 的 -j
选项,其参数名和自身程序名没有太大关联,让人觉得不直观不好记。
幸好有一个 -a
(auto)参数可以智能的根据后缀名自动处理。
提示:
-f
表示目标文件名-c
表示创建一个打包文件-x
表示提取一个打包文件
1 | # 归档并使用 gzip 压缩 |
-c
表示创建 Create,-x
表示提取 Extract,这样再配合 -a
表示自动 Auto 就很好记了。
zip 与 unzip
对于 .zip
文件可以使用 zip 与 unzip 程序。
1 | # 使用 zip 压缩指定文件 |
还需要注意与 tar 不同的是,如果指定的归档文件已经存在,那么是对其更新而不是替换。
在解压缩 .zip
文件时可以使用 unzip。
1 | unzip <文件名>.zip |
unzip 还有一些比较实用的选项,比如 -l
选项可以只查看文件内容而不进行提取文件。
在提取时如果指定文件名可以有选择的只提取指定文件:
1 | unzip Documents.zip README/01.md |
如上,假设通过 -l
选项知道了 Documents.zip
文件中有一个 README
目录,而我需要其中名为 01.md
的文件,就可以使用如上示例进行提取。