Linux中文件与文件系统的压缩命令

本文主要是《鸟哥的Linux私房菜》一书中第八章的学习汇总,包括Linux系统文件压缩、打包命令

一、压缩技术

目前所用的计算机系统都是使用字节单位来计量,但是最小的单位却是 bit,而 1B=8bit,所以比如要记录数字 7,就应该是 00000111,显然前面的 0 很占空间。那么这里讲了两种压缩技术,一种是通过一些方式将这些没有用到的空间腾出来,另一种方式是将上述数字合并一下,即记录为“5个0,3个1”。

二、Linux常见压缩命令

Linux环境下,压缩文件扩展名大多为:

1
2
3
4
5
6
7
8
9
*.Z         # compress 程序压缩的文件
*.zip # zip 程序压缩的文件
*.gz # gzip 程序压缩的文件
*.bz2 # bzip2 程序压缩的文件
*.xz # xz 程序压缩的文件
*.tar # tar 程序打包的文件,并没有压缩过
*.tar.gz # tar 程序打包的文件,并且由 gzip 程序压缩
*.tar.bz2 # tar 程序打包的文件,并且由 bzip2 程序压缩
*.tar.xz # tar 程序打包的文件,并且由 xz 程序压缩

可见最常见的压缩命令就是gzipbzip2xz了,而compress已经不流行了,然后zip只是为了支持Windows更常见的zip而搞的 (不过我感觉我个人用 WinRAR 更多捏)
然后这仨都只能用于单个文件的压缩与解压缩,如果想要一大堆文件或者目录一起搞,就需要tar命令进行打包

gzip

gzip采用 Lempel-Ziv 算法进行压缩,所创建的压缩文件为*.gz,用法如下:

1
2
3
4
5
6
7
8
9
10
$ gzip [-cdtv#] 文件名
选项与参数:
-c : 将压缩的数据输出到屏幕上,可通过数据流重定向来处理
-d : 解压缩的参数
-t : 用来检验一个压缩文件的一致性,查看文件有无错误
-v : 显示原文件/压缩文件的压缩比等消息
-# : #指数字,代表压缩等级,-1最快,压缩比最差;-9最慢,压缩比最好,默认-6
常用:
$ gzip -v 文件名 # 显示压缩比
$ gzip -d 文件名 # 解压缩(*.Z、*.gz都可以解),并删除原本的压缩文件

如上即可将单个文件进行压缩,但是注意原文件会“消失”,也就是原有的文件变成了同名的压缩文件,那么可以利用重定向来保留原本文件:

1
2
$ gzip -9 -c testfile > testfile.gz
# 上述可利用 > 将由屏幕输出的数据转成输出到文件

如果想查看压缩文件的内容,可利用如下命令而非将文件解压缩:

1
2
3
$ zcat/zmore/zless *.gz # 仅针对纯文本文件压缩后的文件
$ egrep …… # 针对压缩文件的grep命令
# 如果你还有用 compress 压缩的 *.Z 文件,可以利用 znew 转换成 gzip 格式

bzip2 & xz

这两个命令和gzip几乎一模一样,具体内容可以直接 man
然后需要了解的就是压缩效果:gzip最弱,xz最强(xzgg最强😧)。当然压缩效果越强,花的时间就越久,具体可以自己试试,然后自行衡量时间成本

三、打包命令tar

tar可以将多个目录或文件打包成一个大文件,并且可以通过前面所述的三种压缩命令(同时)进行压缩。而且目前 Windows 的 WinRAR 也支持 .tar.gz 文件名的解压缩。下面介绍基础的三个命令(其余请自行 man)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 打包与压缩
$ tar [-z|-j|-J] [cv] [-f 待建立的新文件名] filename...
# 查看文件名
$ tar [-z|-j|-J] [tv] [-f 既有的 tar 文件名]
# 解压缩
$ tar [-z|-j|-J] [xv] [-f 既有的 tar 文件名] [-C 目录]
选项与参数:
-v : 在压缩/解压缩的过程中,将正在处理的文件名显示出来
-f filename : -f 后面紧跟要被处理的文件名,此时建议 -f 单独写一个选项
-z|-j|-J : 分别是通过 gzip/bzip2/xz 的支持进行压缩/解压缩,注意这三个不可出现在一串命令中(就是选一个用就行)
-c : 建立打包文件
-t : 查看打包文件的内容(含有哪些文件名)
-x : 解包或解压缩的功能,注意ctx这三个也不能出现在同一串命令中
-C 目录 : 这个选项用于在自定义目录下进行解压缩
-p : 保留备份数据的原本权限和属性
-P : 保留绝对路径,亦即允许备份数据中含有根目录存在之意
--exclude=FILE : 在压缩的过程中,忽略 FILE 文件

这里需要注意的几点有:

  1. [-f filename] 是紧连在一起的,也就是说,可以写成:
1
$ tar -jcvf filename ...

但是不能写成:

1
$ tar -jvfc fileneme ...

因为这样一来,文件名就变成了 c 😮

  1. 在备份重要的系统数据 (/etc) 时,最好加上-p参数,这个是为了保存原本文件的权限与属性,也就是去掉根目录,因为如果没有去掉的话,解压缩的文件名就是绝对路径,也就是说解压缩出来的数据直接覆盖到原本的位置上去了,这就牙白了。而加上之后,比如压缩了 /etc,然后在 /tmp 目录下解压缩,就会得到 /tmp/etc
  2. 而如果想保留根目录的话,就加上-P参数即可
  3. 在特定目录解压缩用[-C 特定目录]即可
  4. 想要打包某个目录,但是不想包括其中的某些文件时(类似于 .gitignore 的作用,常用于在本目录进行打包压缩,但是不包括自身的情况),直接用[--exclude filename]就行,可用通配符,多个--exclude中间需要保留空格。

📝 例题

现在需要备份如下几个目录:

  • /etc/ (配置文件)
  • /home/ (用户的家目录)
  • /var/spool/mail/ (系统中所有账号的邮箱)
  • /var/spool/cron/ (所有账号的定时任务配置文件)
  • /root/ (系统管理员的家目录)

然后 /home/loop* 不需要备份,/root 下的压缩文件也不需要备份。假设备份后的数据需要保存到目录 /backup 里,且该目录仅有 root 有权限进入。备份的文件名取作:backup-system-20220810.tar.bz2

🌆 参考答案

1
2
3
4
5
6
7
8
# 1. 先处理要放置备份数据的目录和权限
# 注意这里虽然写的是$,但是实际要用root的权限
$ mkdir /backup
$ chmod 700 /backup
# 2. 建立备份方式如下
$ tar -jcv -f /backup/backup-system-20220810.tar.bz2 \
> --exclude=/root/*.bz2 --exclude=/root/*.gz --exclude=/home/loop* \
> /etc /home /var/spool/mail /var/spool/cron /root

四、总结

好久没写博客了,这段时间属于是摆烂到极致了,不过马上就回去了,期待开学的生活,当然也不期待,一直摆烂一直爽,《鸟哥的Linux私房菜》这本书不是很推荐阅读,778页,太多了,前两部分一共八章就看了我好几周,属实是有点慢,推荐看狂神的课入个门,然后关于shell脚本编程我暂时没有好的资源推荐,因为我还没学到这来👋
一点私货🌠:08年的谍战剧《潜伏》,孙红雷主演


Linux中文件与文件系统的压缩命令
https://zongjy.github.io/2022/08/07/4863e1cdde21/
作者
zongjy
发布于
2022年8月7日
许可协议