linux学习笔记3 文件压缩

Linux文件压缩

这一部分比较简单,主要就是几条命令的记忆。另外linux下的几条命令(不包括zip)都是针对“文件”来使用的,即使操作对象是“文件夹”,实际上也是分别压缩文件夹下的每一个文件,所以要想压缩整个文件夹的时候我们首先需要将其打包,使用tar指令,将文件夹打包成一个文件(默认是不进行压缩的)。不过现在tar打包的时候也可以使用参数指定压缩方法,如:

  • -z 使用gzip压缩
  • -j 使用bzip2压缩
  • -J 使用xz进行压缩

这几种压缩方式,压缩率依次增加,但是花费的时间代价也越多,xz可能要比gzip多花十倍时间。

压缩解压缩命令

gzip

gzip可以解压compress,zip,gzip压缩的软件,创建的文件则为*.gz。

1
2
3
4
5
6
gzip [-cdtv#] 文件名
-c 压缩的数据输出到屏幕上 可以使用管道进行重定向到新文件
-d 解压 gunzip也可以解压
-t 压缩文件一致性检查
-v 显示源文件和压缩文件的压缩比等信息
-# 替换为数字,表示压缩比,1~9,数字越大,文件越小,当然也越慢

gzip压缩的时候,会直接吧源文件压缩,即压缩完之后就只剩下.gz文件了所以可以使用-c 之后重定向到新文件中。 gzip -c files > files.gz,如果压缩的是纯文本文件还可以使用zcat,zmore zless,zgrep等命令进行查看。

bzip2

bzip2 提供了更高的压缩率,使用方式也基本相同。

1
2
3
4
5
6
7
bzip2 p-cdkzv#] 文件名
-c 压缩产生的数据输出到屏幕上
-d 解压
-k 保留原始文件 (即使不用重定向也可以保留原始文件了)
-z 压缩 (默认,不加也可)
-v 可以显示源文件以及压缩文件的压缩比等信息
-# 指定压缩比

同样如果压缩的是纯文本内容,可以使用 bzcat/bzmore/bzless/bzgrep来进行查看。

xz

比bzip2有者更高的压缩比,压缩耗时更长。用法也基本一样。

1
2
3
4
5
6
7
xz [-dtlkc#] 文件名
-d 解压
-t 文件完整性检测
-l 列出文件的相关信息如压缩前后的大小
-k 保留源文件
-c 输出到屏幕
-# 压缩程度

打包指令tar

之前说了,上面的几条压缩指令都是对于单个文件来执行的,要想压缩整个文件夹,我们需要先将文件夹打包,这就涉及到tar指令了,目前的tar在打包的同时也可以指定压缩方式,以上面几种压缩方式进行压缩。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
tar [-z|-j|-J] -[cv|xv] -f 文件名字
-c 创建打包文件
-t 查看打包文件的内容有哪些文件名
-x 解打包/压缩(需要带上压缩时的类型)
-z/j/J 压缩参数,分别为gzip bzip2 xz
-v 处理过程中显示文件信息
-f 指定要处理的文件名(如要打包的文件夹)
-C 解压缩时指定解压到哪个目录
-p 保留权限和属性(对系统进行备份)
-P 保留绝对路径 **注意,保留绝对路径的时候,解压后的文件也会放到绝对路径中,会导致当前文件被覆盖,不要随便使用绝对路径备份。**

命令示例:

  1. 压缩:tar -jcvf file.tar.bz2
  2. 查询: tar -jtvf file.tar.bz2 (加上v就能查看权限和属性)
  3. 解压: tar -jxvf file.tar.bz2 -C /dir
  4. 解压单一文件 先通过 -jtvf列出文件并找到要解压的文件然后使用 tar -jxvf files.tgz targetfile 即可。
  5. 使用–exclude= 可以排除目录或者文件,多个目录需要重复写多次。
  6. 仅备份比某个时刻新的文件, 使用–newer-mtime/–newer (只有newer的话还会判断ctime)可以找出指定时刻之后的文件并进行备份,可以使用这个来做增量备份(我之后已更改也会利用这个做一个存档的增量备份与还原脚本)。 tar -zcvf /home.tgz --newer-mtime="2020/11/11" /home/*

我们称仅打包得到的文件为tarfile,打包加压缩得到的文件为tarball。tar还可以将文件打包到其他地方,如一次性写入设备(磁带)无法使用cp来复制,就得使用tar来打包了。

额外补充 dd

另外补充一下dd这条命令,我们值卡创建一个文件使用到了dd命令,不过dd不止可以用来创建一个空白的文件,也可以用来进行复制备份(不压缩),还可以将iso文件的内容写道磁盘/U盘上。

dd命令可以直接读取磁盘的内容(直接读取扇区)

1
2
3
4
5
dd if="input_file" of="output_file" bs="block_size" count=number
if: 读入的文件或者设备
of: 写入的文件或者设备
bs: 一个块的大小,默认512字节
count: 多少个块

不过由于dd是一个扇区一个扇区的读/写,所以即使扇区中只有部分空间具有数据,也会原样复制,所以dd备份出来的文件和原来的文件系统是一样大的(即使原文件系统只使用了部分空间),而诸如xfsdump等备份指令会重新组织文件,会忽略空的部分。另外,由于dd是按扇区来复制,所以超级块等信息也会被复制一份,这样dd出的备份是没办法直接挂载在同一个文件系统内的,我们可能还需要做一些符合当前文件系统要求的操作,诸如UUID等属性,才能挂载到当前文件系统下。

comments powered by Disqus
本站访客数:
使用 Hugo 构建
主题 StackJimmy 设计