Linux文件压缩与打包

本文知识点:gzip、bzip2、xz、tar

  • 压缩效率:gzip>bzip2>xz
  • 压缩比:gzip<bzip2<xz

我们都知道对于Linux来说,文件扩展名并没有实质的作用,扩展名只是为了能够快速的判断它是什么类型的文件,从而使用对应的程序来使用它。压缩包文件亦是如此,常见的压缩包扩展名有:*.tar、*.gz、*.bz2、*.xz、*.tar.gz等。通过扩展名来判断是使用哪种压缩软件所压缩出来的,从而使用对应的压缩命令来解压文件。

简单列一下压缩程序与扩展名的对应关系:

*.gzgzip程序压缩的文件
*.bz2bzip2程序压缩的文件
*.xzxz程序压缩的文件
*.tartar程序打包的文件,非压缩
*.tar.gztar程序打包的文件,并用gzip压缩
*.tar.bz2tar程序打包的文件,并用bzip2压缩
*.tar.xztar程序打包的文件,并用xz压缩

1.gzip,zcat/zmore/zless/zgrep

[root@Ansible ~]# gzip --help
Usage: gzip [OPTION]… [FILE]…
常用参数介绍:
-c:将压缩的数据输出到屏幕上
-d:解压缩
-t:检查压缩包文件的一致性
-l:列出压缩文件的相关信息
-v:显示压缩比
number:number取值-1~-9,-1压缩速度最快,压缩比最差;-9压缩速度最慢,压缩比最高,默认取值-6

简单使用:

[root@Ansible study]# ll
total 12
-rw-r--r--. 1 root root 11423 Nov 9 22:30 123.sh
[root@Ansible study]# gzip -v 123.sh
123.xlsx: 23.3% -- replaced with 123.sh.gz
#在默认情况下,源文件会被压缩成.gz文件,而源文件就不再存在了。
[root@Ansible study]# gzip -l 123.sh.gz
compressed uncompressed ratio uncompressed_name
      8789        11423 23.3% 123.sh

压缩文件不是能通过cat/less/more/grep直接读取的,而zcat/zmore/zless/zgrep可以用来读取gzip生成的压缩文件。

2.bzip2,bzcat/bzmore/bzless/bzgrep

用法几乎与gzip一样

3.xz,xzcat/xzmore/xzless/xzgrep

用法几乎与gzip一样

4.tar

gzip、bzip2、xz仅能对单一的文件进行压缩,即使对目录压缩,也是对目录中的文件分别进行压缩,并不会将目录打包。

[root@Ansible study]# tar [-zjJcCxvpPt] [-f name.tar]  filename/dirname
常用参数介绍:
-c:打包文件
-x:解压缩文件
-z:使用gzip进行压缩或解压缩
-j:使用bzip2进行压缩或解压缩
-J:使用xz进行压缩或者解压缩
-C:指定解压目录
-v:将压缩或解压缩打印在屏幕上
-p:保留源文件的权限和属性,常用于备份
-P:保留绝对路径,一般不建议使用,使用此参数的备份路径前会以/开头,解压缩时容易覆盖现有目录
-t:查看打包文件内含有哪些文件
-f:指定打包文件名
--exclude=file:排除文件不打包

常用选项,可根据实际情况-z、-j或者-J:

  • 压缩:tar -zcv -f filename.tar.gz filename/dirname
  • 查询:tar -ztv -f filename.tar.gz
  • 解压缩:tar -zxv -f filename.tar.gz -C dest_dir

5.gzip、bzip2、xz压缩比与效率比较

对比real所消耗的时间:

[root@Ansible ~]# time tar -zcp -f /root/etc.tar.gz /etc/
tar: Removing leading `/' from member names   #移除了目录前面的/
real 0m1.024s
user 0m0.921s
sys 0m0.095s
[root@Ansible ~]# time tar -jcp -f /root/etc.tar.bz2 /etc/
tar: Removing leading `/' from member names
real 0m2.765s
user 0m2.548s
sys 0m0.203s
[root@Ansible ~]# time tar -Jcp -f /root/etc.tar.xz /etc/
tar: Removing leading `/' from member names
real 0m12.471s
user 0m11.796s
sys 0m0.606s

压缩文件大小对比:

[root@Ansible ~]# ll -h etc.tar.*
-rw-r--r--. 1 root root 9.8M Nov 10 19:59 etc.tar.gz
-rw-r--r--. 1 root root 8.7M Nov 10 19:59 etc.tar.bz2
-rw-r--r--. 1 root root 7.0M Nov 10 19:59 etc.tar.xz

6.备份较新的文件

使用–newer-time参数即可

[root@Ansible ~]# tar -zcvp --newer-mtime="20200101" -f /root/etc.newer.tar.gz /etc/

需要注意的是此参数只是对文件的时间进行筛选,对目录是无效的,它会把所有的目录打包进来。一开始还以为–newer-time参数没起作用(ˉ▽ˉ;)…

[root@Ansible study]# ll
total 12
drwxr-xr-x. 3 root root 16 Nov 10 21:24 1
-rw-r--r--. 1 root root 12 Nov 9 22:51 1.txt
drwxr-xr-x. 2 root root 6 Nov 10 21:24 2
-rw-r--r--. 1 root root 10 Nov 9 22:51 2.txt
drwxr-xr-x. 2 root root 6 Nov 10 21:24 3
-rw-r--r--. 1 root root 16 Nov 9 22:51 3.txt
[root@Ansible study]# tar -zcv --newer-mtime="20201111" -f test.tar.gz ./
tar: Option --newer-mtime: Treating date `20201111' as 2020-11-11 00:00:00
./
./1/
./1/11/
./2/
./3/
tar: ./1.txt: file is unchanged; not dumped
tar: ./2.txt: file is unchanged; not dumped
tar: ./3.txt: file is unchanged; not dumped
[root@Ansible study]# tar -ztv -f test.tar.gz
drwxr-xr-x root/root 0 2020-11-10 21:31 ./
drwxr-xr-x root/root 0 2020-11-10 21:24 ./1/
drwxr-xr-x root/root 0 2020-11-10 21:24 ./1/11/
drwxr-xr-x root/root 0 2020-11-10 21:24 ./2/
drwxr-xr-x root/root 0 2020-11-10 21:24 ./3/


「 文章如果对你有帮助,请点个赞哦^^ 」 

4+