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
bzip2
和 xz
的用法与 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
(包含mtime
和ctime
)和--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