说说 Linux 中的压缩与解压缩指令(tar)

说说 Linux 中的压缩与解压缩指令(tar),第1张

tar 的功能类似于 Windows 中的 WinRAR。它可以将多个目录文件打包成一个大文件,在打包的过程中还可以透过 gzip/bzip2/xz 的支持,对文件进行压缩 1 。

tar 的选项参数很多,主要用到的有以下这些:

还是太多,记不住怎么办? 记住下面这些最常用的命令即可:

总结一下:z 为gzip;j 为bzip2;J 为xz。c 为压缩;t 为查询;x 为解压缩。最后跟着 vf。f 一定要是最后一个,如果放在其他选项之前,tar 就会把文件名搞错。比如 tar -zcfv xxx 命令,tar 指令就会认为压缩文件名为 v!

压缩的文件名称要根据压缩算法加上响应的后缀:

只有知道了压缩算法,我们才能解的出来,你说是吗?所以文件名规范很重要。

假设我们需要备份 /etc 文件夹,把它打成一个压缩包 1 。这在实际应用中很常见,因为 /etc 文件夹存放了系统主要配置文件。在英文中完整单词是etc.,也就是后面会带上一个句点,表示“等等”之意。

接下来,我们分别使用 gzip、bzip2与 xz 算法对 /etc 文件夹进行打包压缩。

gzip 压缩指令: time tar -zpcvf /root/etc.tar.gz /etc

bzip2压缩指令: time tar -jpcvf /root/etc.tar.bz2 /etc

xz 压缩指令: time tar -Jpcvf /root/etc.tar.xz /etc

从 real 中可以看出: gzip 的压缩速度最快,而 xz 的压缩速度最慢。

从大小上来看,xz 的压缩率最高,而gzip 压缩率最差。

压缩率高,自然需要时间成本。因此需要压缩的文件夹很大,那么就要多多考虑时间成本咯。因为 gzip 压缩速度快,这也是 *.tar.gz 比较流行的原因之一。

假设有这样一种场景:我们需要打包某个文件夹(/root),但这个文件夹中的某个文件或者子文件夹不想打包进去(带 etc 前缀)。也就是希望这个文件夹部分打包,部分不打包。可以执行以下指令:

tar -zcvf /root/test.tar.gz --exclude=/root/etc* --exclude=/root/test.tar.gz /root

加了 --exclude=/root/test.tar.gz 是为了排除自身,否则压缩包中会包含一个大小为 0 的自身文件,这恐怕不是我们希望看到的:

通过 tar -ztvf test.tar.gz 就可以查看刚刚新打的压缩包中所包含的文件列表:

使用命令 tar -ztvf etc.tar.gz 查看刚刚打好的压缩包。注意要使用匹配的解压缩算法才能正确解压,比如示例中是 gz 作为后缀,所以加了 -z 选项表示使用 gzip 算法进行解压。

部分输出内容:

可以看到该命令把文件的权限、账户以及归属组也一并打印出来了。

而且还有一点很关键,这些文件都没有根目录。如果没有拿掉根目录,解压缩后的文件名就会是绝对路径, 亦即解压缩后的数据一定会被放置 到 /etc/xxx 去 1 !这样系统的 /etc 文件夹就会被覆盖,后果很严重。所以,tar 打包指令默认都会去除放入包中文件的根目录。除非通过 -P 显示要求保留这些文件的根目录。

(1)完全解压

利用 tar -zxvf etc.tar.gz -C /tmp 命令把 etc.tar.gz 解压到 /tmp。解压成功后,就会在 /tmp 下看到 /etc 文件夹。

如果需要在本地路径下直接解开,那直接执行 tar -zxvf etc.tar.gz 即可。

(2)部分解压

假设我们需要把压缩包(etc.tar.gz)中的 vconsole.conf 解压出来。可以先执行以下命令,查询出该文件所对应的相对路径:

tar -ztvf etc.tar.gz | grep ‘console’

拿到需要解压的文件路径之后,就可以执行 tar -zxvf etc.tar.gz etc/vconsole.conf

进入当前目录的 etc 文件夹,就可以看到 vconsole.conf 已经被解压出来了:

【1】 鸟哥. 鸟哥的Linux私房菜 基础学习篇[M]. 第四版. 北京: 人民邮电出版社,2018:359-362.

什么是压缩包

说得容易懂点压缩包就是已经被压缩的文件(体积大小比没压缩前小),如果要打开压缩包,就要下载WINRAR安装,双击解压缩,即可使用压缩包里的文件了!

在计算机科学中,RAR是一种文件压缩与归档的私有格式。RAR的名字源自其作者Eugene Roshal,为Roshal ARchive的缩写。Eugene Roshal最初编写了DOS版本的编码和解码程序,后来移植到很多平台,例如比较著名的Windows平台上的WinRAR。Eugene Roshal有条件的公开了解码程序的源代码,但是编码程序仍然是私有的。

RAR文件的扩展名是.rar,MIME类型是application/x-rar-pressed。同样是无损数据压缩,RAR文件通常比ZIP文件压缩比要高,但是压缩速度较慢。因为RAR文件头也要占据一定空间,在数据压缩余地不大时,压缩过的文件可能比原文件要大。RAR的一个主要优点是可以把文件压缩目标分割到多个文件,并且很容易从这样的分割的压缩文件解压出源文件。另外,RAR也支持紧缩格式,把所有文件压缩到同一个数据区以加大压缩比,代价是解压一个单独的文件时必须解压其前面的所有文件。新的RAR的加密算法使用的是AES,而旧的RAR的加密算法是私有的。这两种算法都很难破解,所以在没有密码的情况下只能用字典暴力破解法来破解。RAR中也可以加入冗余的修复信息,在文件损坏但是修复信息足够完好时可以对压缩包进行修复。

什么是压缩包?有什么作用?

压缩包就是被压缩的文件包,可以少量减少存储空间

压缩包是什么?

就是将文件集合在一起然后,压缩减少存放空间,可以下载解压软件解压

就是压缩文件

就是以前很大的文件,用软件将它变得小一些.(变小不就是压缩么)

而几个文件或很多同时压缩成一个文件(就像书包里装了很多东西)不就是压缩包了么。

这常见的压缩工具应该是winRAR。

winRAR压缩包和winRAR ZTP压缩包有什么区别

RAR可以解压缩ZIP文件 (RAR包含了ZIP的所有功能

)

但是ZIP不能解压RAR文件

在国内使用RAR就可以了

压缩包压缩率取决于什么 Linux源代码压缩包压缩率怎么这幺小

压缩率主要取决于算法,其次是字典大小。

至于 Linux 源代码压缩率小,请看是什么压缩算法。

Linux 下面开源最大的压缩算法是 LZMA ,就是 7Z 用的那个算法。现在这个算法的一般用的扩展名是 xz 。

压缩解压缩命令也是 xz 。

不过,这个和 Linux 下面的一些压缩软件一样,只支持数据流压缩。也就是只能压缩一个文件。

什么叫压缩包?

压缩文件的基本原理是查找文件内的重复字节,并建立一个相同字节的" 词典"文件,并用一个代码表示,比如在文件里有几处有一个相同的词" 中华人民共和国"用一个代码表示并写入"词典"文件,这样就可以达到缩小文件的目的。

作用:

1、节省磁盘空间;

2、可以把多个 文件压缩成一个压缩包,此功能在发送邮件时用处比较大,因为邮件附件多个文件通常要一个个的上传,把多个文件压缩成一个压缩包后就可以完成一次上传了;

3、可以把一个大文件分解压缩成多个小压缩包,此功能在文件拷贝中作用比较大,比如所你现在有个300M的文件需要拷贝到别的电脑中,而你的优盘只有256M,这时候可以用压缩软件把文件分成两个150M的压缩包然后分别拷贝就行了;

4、此外部分 软件如 WinRAR可以实现对文件的压缩保密保护,就是在形成压缩包的时候添加解压密码,这样生成的压缩包别人没有密码是无法打开的,可以起到一定的文件保密作用。

tt.jar是什么压缩包

这不是压缩包,这是java的jar包,可以用eclipse打成的包,但是也可以解压。这种包java类库中有很多,你自己也可以打的

压缩包后缀是什么

很多,常用rar,zip,7z等

Linux下进行文件的解压、复制、移动应该是最常见的 *** 作了。尤其是我们在项目中使用大量的数据集文件(比如机器学习)文件。然而使用这些命令时一不留神就会掉进坑里,这篇文章我们就来细数用Shell进行文件 *** 作的这些坑。

Linux下压缩文件的常见扩展名包括 .gz , .tar , .tar.gz , .zip 等。这些压缩格式都能够跨平台(Windows/Mac/Linux)使用。下面我们以 .zip 文件为例子来讲解。我们已知一个文本文件压缩包 test.zip ,想把它解压,很简单,运行 unzip 命令即可:

如果我们想要将 test.txt 重新压缩呢?你可能情不自禁会执行 zip test.txt ,然后我们发现提示:

其实是传参数传错了,导致 zip 误把 test.txt 当成压缩后的文件名了,这当然不是合法的。我们看 zip 的参数构成:

[-b path] 是压缩后的 .zip 文件的路径, zipfile list 是待压缩的文件列表。于是,我们这样写即可成功压缩:

当然, zip 也支持将多个文件压缩:

此时我们发现再解压 test3.zip 会发现重新得到了两个原始文件:

zip 也支持对目录压缩,如我们尝试压缩 test 目录:

此时再解压 test4.zip 则会重新生成 test 目录:

不过, zip 是将输入的文件列表 分别 进行压缩的 *** 作,即是对目录来进行压缩也是对目录内的所有文件one-by-one的 *** 作。那我们需要将很多文件先打包成一个文件,然后再压缩呢?此时就要用到 tar 了。

很多人误解 tar 是个压缩命令,其实压缩命令是 gzip 、 xz 以及我们上文提到的 zip 这些。 tar 是个打包命令,只不过附带压缩与解压的功能。 tar 的选项多如牛毛,为了减轻大家的记忆负担,我们只介绍下面两个选项:

-c : 建立打包文件(可搭配 -v 将过程中打包的文件可视化);

-x :解包或解压缩的功能(可搭配 -C 在特定目录解压);

(其实还有表示通过gzip进行压缩/解压缩的 -z ,通过bzip2的支持进行压缩/解压缩的 -j ,通过xz的支持进行压缩解压缩的 -J 等,但我们这里统一用 .zip 示范,就省去这些参数了)

那么,我们只需要记住下面的命令即可:

压缩:tar -cv -f filename.zip 要被压缩的文件或目录名称

解压缩: tar -xv -f filename.zip -C 欲解压的目录(这个目录必须已经存在)

注意,压缩传参顺序是压缩后的.zip文件在前,压缩前的文件在后 ,别搞错了。(让人联想到gcc编译器,不过 gcc 传参时规定是 -o output_file.out 的形式来指定输出的可执行文件,就回避了这个顺序问题)

比如,我们要将 test 文件夹(该文件夹下有一个 test.txt 文件)压缩,可以运行如下命令:

然后将其解压到当前目录,可运行如下命令:

多个文件压缩:

然后将其解压到当前目录:

由上面所说, zip / unzip 和 tar 都是压缩什么解压出来就是什么,原来是目录就是目录,原来没目录不会帮你自动生成一个目录 ,但Linux或Mac系统的可视化压缩工具就不一样了(在Mac中被称为「归档实用工具」)。Mac中对目录压缩时压缩命令和 tar 命令是等效的,比如我们想用Mac自带的压缩工具压缩 test 文件夹:

会生成对应的归档文件:

再解压会得到同样的文件夹(会自动帮我们重命名),不会帮我们生成多余的目录:

这个文件夹内部才是我们需要的文件:

它会自动帮我们生成一个名为 归档.zip 的文件:

这个文件夹内部才是我们需要的文件:

这个文件夹内部才是我们需要的文件:

这在对大量文件 *** 作时需要额外注意,否则会白白开销你一次拷贝文件的时间!

我们紧接着上面的情景。假设我们当前的目录为项目目录,而我们手滑使用了系统自带的可视化解压工具生成了一个多余的目录。我们接下来要把系统生成的多余的 归档 文件夹里的文件拷贝到当前目录,那么我们可以使用带 r 参数的 cp 命令:

这里 -r 参数表示递归复制命令,用于目录的递归复制。注意命令中的 归档/ 表示 归档 目录下的所有文件,意思和 归档/* 相同:

选项参数 -r 写成 -R 是等效的:

但如果直接传入参数 归档 ,则表示将这个目录整个地复制:

同一个目录下不可能有两个相同名称的子目录,这当然就会出错,当然我们可以将其复制到另外一个目录里:

你可能要问,加 r 和不加 r 有啥区别?如果不加 r ,则默认是跳过目录的,也就是说只能copy文件:

我们还是紧接着上面的场景。假定我们已经将 归档 文件夹中的 test.txt 、 test2.txt 成功拷贝到当前项目目录了。现在我们有了个新的需求:我们在项目目录中建了一个 data 子目录,现在需要将项目目录中的 test.txt 、 test2.txt 移动到 data 子目录中。这就需要如下命令:

注意,如果有多个源文件或目录,则最后一个目标文件(也就是这里的data)一定是目录 。当我们只移动一个文件时,就有潜在的二义性。这里因为 data 目录本身存在,我们移动 test.txt 到 data 目录还能正常执行:

但是如果data目录不存在,就会将 mv 解释为重命名的意思,比如如果我们将 data 目录删除再执行:

此时就等效于把 test.txt 更名为 data 文件:

可以看出,第一个字母是 - ,也就意味着 data 是普通文件,不是目录(是目录的话第一个字母是 d )。

因此,使用 mv 语句时要格外小心,因为它既有移动到目录的作用,也有重命名的作用,一不注意就可能出错!

有移动到目录的作用,也有重命名的作用,一不注意就可能出错!

就可能出错!


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7641714.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-08
下一篇2023-04-08

发表评论

登录后才能评论

评论列表(0条)

    保存