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