[Linux基础]-11-文件的压缩和归档

引言

这篇文章主要介绍Linux下如何对单个文件进行压缩和解压缩,如何对一个文件夹中的多个文件进行归档压缩和解压缩。

文章目录

0×1.使用Gzip对文件进行压缩和解压缩

就好像Windows下有"rar"的压缩方式、"zip"的压缩方式等等,Linux除了这些压缩方式之外,还有"gzip"、"bzip2"等压缩方式,下面请看几个实例:

#在当前用户的家目录中有一个文件"testfile"和一个文件夹"vmtools"
987@hk987.xyz:~$ ls -l
-rw-r--r--. 1 hk987 hk987 218273 Jan  1 10:15 testfile
drwxr-xr-x. 3 hk987 hk987   4096 Jan  1 10:08 vmtools

#使用gzip对"testfile"进行压缩,这个命令其实不需要携带任何参数
#比较有用的参数是-[1-9]指定压缩比率,9为最大压缩比,压缩的时间也相对较长
987@hk987.xyz:~$ gzip -9 testfile

#这种压缩方式是直接将源文件压缩成一个后缀为".gz"的压缩包,不会保留源文件
#这和Windows下的WinRAR的"压缩后删除源文件"功能相同,文件大小也从"218273"降至"17797"。
987@hk987.xyz:~$ ls -l
-rw-r--r--. 1 hk987 hk987 17797 Jan  1 10:15 testfile.gz
drwxr-xr-x. 3 hk987 hk987  4096 Jan  1 10:08 vmtools

#如果想使用gzip压缩,但是又保留源文件,可以使用-c参数
#-c参数将testfile文件的压缩的结果输出给>后面的文件
#如果使用gzip压缩,建议输出的文件添加.gz后缀
987@hk987.xyz:~$ gzip -9c testfile > testfile.gz

#解压缩,解压缩其中的文件出来之后,会将testfile.gz这个压缩包删除
987@hk987.xyz:~$ gzip -d testfile.gz
#如果想保留压缩文件,同样加上-c参数
987@hk987.xyz:~$ gzip -cd testfile.gz > testfile
Bash

0×2.使用Bzip2对文件进行压缩和解压缩

bzip2相对gzip拥有更大的压缩比,但压缩时间也较长:

#使用bzip2进行压缩,压缩率同样设置成9,最大压缩率
987@hk987.xyz:~$ bzip2 -9 testfile
#同gzip一样,如果不想删除源文件
987@hk987.xyz:~$ bzip2 -9c testfile > testfile.bz2

#可以查看到,文件大小比gzip压缩后的要小,bzip2压缩后的后缀是".bz2"
987@hk987.xyz:~$ ls -l
-rw-r--r--. 1 hk987 hk987 14851 Jan  1 10:15 testfile.bz2
drwxr-xr-x. 3 hk987 hk987  4096 Jan  1 10:08 vmtools

#解压缩
987@hk987.xyz:~$ bzip2 -d testfile.bz2
#不删压缩包的解压方法
987@hk987.xyz:~$ bzip2 -cd testfile.bz2 > testfile
Bash

0×3.使用Gzip方式创建文件夹归档

可以使用tar命令对文件夹进行归档压缩(同样也能对单个文件使用归档压缩,tar归档压缩的方式默认不会删除源文件),下面是gzip方式的归档压缩实例:

#tar的选项参数中"vczf"解释如下:
#v 显示详细信息
#c 创建归档
#z 使用gzip压缩
#f 文件名(可带路径)
#紧接着选项参数的,是压缩后的文件名称"vmtools.tar.gz"
#一般使用gzip压缩归档,在文件名后面添加.tar.gz后缀(或.tgz)
#这样能更直观的明白归档是用什么压缩的
#否则使用不同方式的解压缩会出现错误
#最后一个参数是被归档的文件夹"vmtools/"
987@hk987.xyz:~$ tar -vczf vmtools.tar.gz vmtools/

#归档不同于对单个文件的压缩,归档后不会删除源文件夹
987@hk987.xyz:~$ ls -l
-rw-r--r--. 1 hk987 hk987   218273 Jan  1 10:15 testfile
drwxr-xr-x. 3 hk987 hk987     4096 Jan  1 10:08 vmtools
-rw-rw-r--. 1 hk987 hk987 59410183 Jan  1 10:34 vmtools.tar.gz

#如果要排除目录中的某个文件或目录,可以添加--exclude参数,每个exclude参数可以排除掉目录中的一个对象(可以是文件或目录)
987@hk987.xyz:~$  tar -vczf vmtools.tar.gz --exclude=for.py --exclude=if.py vmtools/

#解压缩归档文件,参数x代表"释放归档"
987@hk987.xyz:~$ tar -vxzf vmtools.tar.gz

# 释放到指定的目录
#-C后面接目标目录的绝对路径或相对路径,本例是将当前目录的"vmtools.tar.gz"释放到当前目录的"testdir"这个目录中,"./"代表当前目录,这是一个相对路径的写法
987@hk987.xyz:~$ tar -vxzf vmtools.tar.gz -C ./testdir
Bash

*** 小技巧:使用tar加密压缩文件或文件夹(注意,本文中的aes-256-ofb加密方式随着时间的推移可能会变得不安全,目前是安全的2024.10.28,届时请替换成当下安全的加密方式)

#使用tar加密压缩文件或文件夹
#test-lab是需要加密压缩的文件或文件夹
#enc -aes-256-ofb指定使用aes-256-ofb加密算法加密,不推荐使用des3,des3即将淘汰
#-k后面跟自定义的密码,本例为123456
#test-lab.xx为加密后输出的文件
#-md sha512 -pbkdf2 -iter 100000 -salt用于将-k后面的密码转换成秘钥
#-iter 100000为覆盖密码的默认迭代次数
987@hk987.xyz:~$ tar -vczf - test-lab | openssl enc -aes-256-ofb -md sha512 -pbkdf2 -iter 100000 -salt -k 123456 -out=test-lab.xx

#解密用tar加密的文件,-k后面的密码需要一致,参数也要相同,迭代次数也必须相同,否则无法算出秘钥
dd if=test-lab.xx | openssl enc -aes-256-ofb -md sha512 -pbkdf2 -iter 100000 -salt -d -k 123456 | tar -vxzf -
Bash

0×4.使用Bzip2方式创建文件夹归档

bzip2的归档和gzip归档的参数大致相同,-z代表使用使用gzip压缩创建归档,-j则是使用bzip2压缩创建归档,唯一需要注意的就是归档文件后缀的写法:

#使用bzip2方式归档(后缀.tar.bz2或.tbz2)
987@hk987.xyz:~$ tar -vcjf vmtools.tar.bz2 vmtools

#释放归档文件,不使用-C参数指定释放位置,就是释放到当前文件夹中
987@hk987.xyz:~$ tar -vxjf vmtools.tar.bz2 -C ./testdir
Bash

bzip2归档方式同样可以使用openssl加密,请参考gzip小节。

0×5.使用zip对文件进行压缩和解压缩

在linux下不推荐使用zip的压缩方式,比较推荐tar,zip压缩效率没有gzip高,并且压缩率也不及gzip,但有时候下载的文件是zip后缀,或者分享文件给windows用户的时候,还是需要使用zip或rar压缩。

zip的常用参数:

-{1-9} 代表压缩率,-9压缩率最高,耗时也最长
-r 递归压缩,用于压缩目录,一般都带上这个参数
-q 不显示压缩过程
-v 显示执行过程
-e 加密压缩

unzip的常用参数:

-d [目录] 指定一个目录存放解压缩后的文件
-l [压缩包] 仅查看压缩包中的文件信息,不解压

#如果默认没有zip和unzip命令,可以先安装
#ubuntu安装
987@hk987.xyz:~$ sudo apt install zip unzip
#archlinux安装
987@hk987.xyz:~$ sudo pacman -S zip unzip

#使用最高压缩率,递归方式,将test-lab文件夹压缩成test.zip
987@hk987.xyz:~$ zip -vr9 test.zip test-lab/

#加密压缩文件,回车后会让你输入两次密码用来加密压缩包
987@hk987.xyz:~$ zip -e test.zip test/

#解压缩test.zip到当前目录下的hk987目录中,对加密的压缩包,解密的时候会提示输入密码
987@hk987.xyz:~$ unzip -d ./hk987 test.zip
Bash

0×6.使用rar对文件进行压缩和解压缩

rar是windows下最常见的压缩格式,在linux中的压缩率也很不错,下面请看实例:

#如果默认没有rar命令,可以先安装
#ubuntu安装
987@hk987.xyz:~$ sudo apt install rar
#archlinux安装
987@hk987.xyz:~$ sudo pacman -S rar

#压缩文件或文件夹,a是添加文件到压缩文件的意思意思我现在要开始压缩了
#-r参数可以递归目录,不管什么情况压缩的时候,带上这个参数就行
#将hk987这个文件或目录压缩成hk987.rar
987@hk987.xyz:~$ rar a -r hk987.rar hk987

#加密压缩文件,-p参数后面直接跟密码,不用空格
987@hk987.xyz:~$ rar a -r -p123456 hk987.rar hk987

#解压缩hk987.rar,保留hk987.rar并且保持hk987.rar中原有的目录结构
987@hk987.xyz:~$ rar x hk987.rar
#如果有密码
987@hk987.xyz:~$ rar x -p123456 hk987.rar
Bash