[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
					
					

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
					
					

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
					
					

*** 小技巧:使用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 -
					
					

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
					
					

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 
					
					

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