说说 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.

1. tar命令

使用tar程序打出来的包我们常称为tar包. tar包文件的命令通常都是以.tar结尾的。生成tar包后. 就可以用其它的程序来进行压缩了. tar命令本身不进行数据压缩. 但可以在打包或解包的同时调用其它的压缩程序. 比如调用gzip、bzip2

    选项:

-c 创建.tar格式包文件

-x 解开.tar格式包文件

-v显示详细信息

-f 使用归档文件

-p 保留原始文件权限

-C 解压到目标文件夹

-z 调用gzip进行压缩或解压

-j 调用bzip2进行压缩或解压

    打包示例: 

  tar -cvf /blog/uouo123/com.tar bb.txt 打包文件

    打包并压缩示例:

tar -zcvf /blog/uouo123/com.tar.gz bb.txt 压缩文件

    解压缩示例:

tar -zxvf /blog/uouo123/com.tar.gz -C /com/bb 解压文件

2. gzip压缩

    常用数据压缩命令. 压缩比例可手工调整.   压缩后文件名 filename.gz:

        注:压缩后文件可直接load至hive数据库. 但每个文件只会产生一个map. 查询效率极低

选项:

-c 将输出写到标准输出上. 并保留原有文件。

-d 将压缩文件解压。

-l 对每个压缩文件. 显示下列字段:

压缩文件的大小;未压缩文件的大小;压缩比;未压缩文件的名字

-r 递归式地查找指定目录并压缩其中的所有文件或者是解压缩。

-t 测试. 检查压缩文件是否完整。

-v 对每一个压缩和解压的文件. 显示文件名和压缩比。

-num 用指定的数字 num 调整压缩的速度. -1 或 --fast 表示最快压缩方法(低压缩比).

-9 或--best表示最慢压缩方法(高压缩比)。系统缺省值为 6。

压缩示例:

gzip filename

    查看gzip压缩文件内容命令:     

    zcat filename.gz

     解压缩命令:

gzip -d filename.gz

    压缩过程中可控制压缩率(1-9). 1压缩最快. 压缩率不高. 9压缩最慢. 压缩比例最高. 缺省为6. 例如:

    gzip -9 filename

3. bzip2压缩

    常用数据压缩命令. 压缩比例比gzip高. 压缩后文件名为filename.bz2

        注:压缩后文件可直接load至hive数据库

    选项

-c或——stdout:将压缩与解压缩的结果送到标准输出;

-d或——decompress:执行解压缩;

-f或-force:bzip2在压缩或解压缩时. 若输出文件与现有文件同名. 预设不会覆盖现有文件。若要覆盖。请使用此参数;

-h或——help:在线帮助;

-k或——keep:bzip2在压缩或解压缩后. 会删除原始文件。若要保留原始文件. 请使用此参数;

-s或——small:降低程序执行时内存的使用量;

-t或——test:测试.bz2压缩文件的完整性;

-v或——verbose:压缩或解压缩文件时. 显示详细的信息;

-z或——compress:强制执行压缩;

-V或——version:显示版本信息;

--repetitive-best:若文件中有重复出现的资料时. 可利用此参数提高压缩效果;

--repetitive-fast:若文件中有重复出现的资料时. 可利用此参数加快执行效果。

    压缩示例:

    bzip2 filename

    解压缩示例:

    bzip2 -d filename.bz2

    直接查看压缩文件示例:     

    bzcat filename.bz2

使用默认压缩情况下压缩性能:

    bzip2 >gzip >tar

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

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

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

压缩解压缩命令也是 xz 。

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


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

原文地址: https://outofmemory.cn/yw/8660271.html

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

发表评论

登录后才能评论

评论列表(0条)

保存