Linux 下压缩和解压操作

常见压缩格式

各种压缩工具使用的压缩技术不同,最后生成的文件后缀也不同,下面是 Linux 下常用的几种压缩格式:

后缀 对应程序
*.Z compress 程序压缩的文件
*.zip zip 程序压缩的文件
*.gz gzip 程序压缩的文件
*.bz2 bzip2 程序压缩的文件
*.xz xz 程序压缩的文件
*.tar tar 程序打包的数据,没有经过压缩
*.tar.gz tar 程序打包的文件,经过 gzip 的压缩
*.tar.bz2 tar 程序打包的文件,经过 bzip2 的压缩
*.tar.xz tar 程序打包的文件,经过 xz 的压缩

gzip 和 bzip2 都只能针对单个文件进行压缩和解压缩,而 tar 可以调用它们来集中打包文件。

单文件压缩解压

compress 程序已经不再被使用,gzip 为系统内置程序,可用的参数有下面这些:

参数 说明
-c 将压缩的数据输出到屏幕上,可通过数据流重定向来处理
-d 解压缩的参数
-t 可以检验压缩包看有无损坏
-v 可以显示出源文件/压缩文件的压缩比等信息
-# 压缩等级,-1 最快,-9 压缩比最高

例如压缩当前目录下的 b.log 文件,不加参数会自动删除原文件:

[root@101c7 audit]$ ll
total 184
-rw-------. 1 root root 182023 Sep  9 05:48 b.log
-rw-r--r--. 1 root root    178 Sep  9 05:57 c.log
[root@101c7 audit]$ gzip -v b.log 
b.log:   93.2% -- replaced with b.log.gz
[root@101c7 audit]$ ll
total 20
-rw-------. 1 root root 12439 Sep  9 05:48 b.log.gz
-rw-r--r--. 1 root root   178 Sep  9 05:57 c.log

使用 -d 参数将文件解压时会删除原压缩文件:

[root@101c7 audit]$ gzip -d b.log.gz ; ll
total 184
-rw-------. 1 root root 182023 Sep  9 05:48 b.log
-rw-r--r--. 1 root root    178 Sep  9 05:57 c.log

将文件按最高压缩比压缩并保留原文件:

[root@101c7 audit]$ gzip -9 -c b.log > b.gz ; ll
total 196
-rw-r--r--. 1 root root  11764 Sep 10 11:09 b.gz
-rw-------. 1 root root 182023 Sep  9 05:48 b.log
-rw-r--r--. 1 root root    178 Sep  9 05:57 c.log

读取被压缩的纯文本文件可以使用 zcat 命令:

[root@101c7 audit]$ zcat b.gz | tail -2
type=CRED_DISP msg=audit(1631178061.322:415): pid=60628 uid=0 auid=0 ses=22 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 msg='op=PAM:setcred grantors=pam_env,pam_unix acct="root" exe="/usr/sbin/crond" hostname=? addr=? terminal=cron res=success'
type=USER_END 

bzip2xz 的用法与 gzip 差不多,只是在压缩比上有区别。

打包命令

使用gzip对目录进行压缩时,其会将目录内的所有文件分别压缩。

将多个文件或目录包成一个大文件的命令称为打包,可以使用 tar 进行。

tar 命令五个主要参数必备其一,不可以同时使用:

参数 说明
-c 新建打包文件;
-t 查看打包文件的内容含有哪些文件;
-x 解压打包文件,搭配-C 指定解压到的目录;
-r 向压缩归档文件末尾追加文件;
-u 更新原压缩包中的文件。

tar 命令其他参数,其中 -f 是必备:

参数 说明
-j 通过bzip2的支持进行压缩解压,文件最好用.tar.bz2后缀;
-z 通过gzip的支持进行压缩解压,文件最好用.tar.gz后缀;
-J 通过xz的支持进行压缩解压,文件最好用.tar.xz后缀;
-v 在压缩解压过程中,将正在处理的文件名显示出来;
-f filename 接要被处理的文件名;
-C dir 解压时指定目标目录,不指定则在当前目录解压。

备份时要用到的参数:

参数 说明
-p 保留备份数据的原本权限和属性,常用于备份重要的配置文件;
-P 保留绝对路径,即允许备份数据中含有根目录;
–exclude=FILE 压缩过程中,排除掉文件 FILE

命令简记如下:

目标 命令
压缩 tar -zcvf 压缩文件名.tar.gz 原文件
解压 tar -zxvf 压缩文件名.tar.gz -C 目标目录
查询 tar -ztvf 压缩文件名.tar.gz

压缩文件

例如,使用 gzip 压缩备份 /etc 这个目录到 /root 下面,使用 -p 参数保留源文件权限和属性:

[root@101c7 ~]$ tar -zpcv -f /root/etc.tar.gz /etc
/etc/vimoutlinerrc
/etc/ntp.conf
/etc/updatedb.conf

压缩时排除某些文件可以用 --exclude= 参数。例如,排除掉 22 文件夹:

[root@101c7 ~]$ tar -zcv -f 2.tar.gz --exclude=/root/2/22 /root/2
tar: Removing leading `/' from member names
/root/2/
/root/2/1.txt

可以使用--new(包含mtimectime)和--newer-mtime时间参数来筛选文件。

比如打包/root/audit/下面修改日期在2021年09月10日之后的文件:

[root@101c7 audit]$ tar -zcv -f new10.tar.gz --newer-mtime="2021/09/10" /root/audit/*
tar: Option --newer-mtime: Treating date `2021/09/10' as 2021-09-10 00:00:00
tar: Removing leading `/' from member names
tar: /root/audit/b.log: file is unchanged; not dumped
/root/audit/c.log

查看压缩包

使用以下命令可以查看压缩文件的内容:

[root@101c7 ~]$ tar -ztv -f /root/etc.tar.gz 
-rw-r--r-- root/root       111 2019-11-27 11:47 etc/sysconfig/ntpdate
-rw-r--r-- root/root        45 2019-11-27 11:47 etc/sysconfig/ntpd
drwxr-xr-x root/root         0 2021-09-07 13:35 etc/xdg/
drwxr-xr-x root/root         0 2018-04-11 00:59 etc/xdg/autostart/
drwxr-xr-x root/root         0 2021-09-07 05:53 etc/xdg/systemd/
lrwxrwxrwx root/root         0 2021-09-07 05:53 etc/xdg/systemd/user -> ../../systemd/user

从显示结果可以看到根目录,也就是文件名开头的 / 被移除了,这样做是为了安全。

如果使用 -P 保留根目录,则解压后的文件会是绝对路径,本地存在的相同文件会被压缩包内文件覆盖。

解压文件

解压缩文件 etc.tar.gz/tmp 目录:

[root@101c7 ~]$ tar -zxv -f etc.tar.gz -C /tmp
etc/gdbinit.d/golang.gdb
etc/vimoutlinerrc
etc/ntp.conf
etc/updatedb.conf

解压 etc.tar.gz 中的单独文件 etc/sudo.conf 到当前目录:

[root@101c7 ~]$ tar -zxv -f etc.tar.gz etc/sudo.conf
etc/sudo.conf
[root@101c7 ~]$ ll etc/
total 4
-rw-r-----. 1 root root 1786 Sep 30  2020 sudo.conf