压缩打包备份

概览

在Windows下通常我们用WinRAR、7zip之类的处理压缩,解压缩文件,Linux下也有一些常见的工具,简单区分一下打包和压缩的概念

  • 打包,把一堆文件或目录打成一个包,不压缩,通常文件大小不变(后缀格式如 .tar)
  • 压缩,比打包多了一个功能,那就是使用不同的算法进行文件压缩,会缩小文件的大小(后缀格式如 .tar.gz)

通常打包压缩是一套组合操作,会一块实现

Linux最常见的压缩格式是 .tar.gz ,虽然Linux不根据文件的后缀格式来区分文件的类型,但是为了人类可读性好,通常都会加上后缀格式

我们在进行打包压缩的时候,通常建议的做法是先 cd 切换到对应的目录,然后在打包压缩,这样尽可能让别人拿到这个压缩包的时候,一解压得到的是一个不包含 .tar.gz 后缀格式的目录,清晰易懂

常见示例

压缩
tar zcf dir1.tar.gz dir/

解压缩
tar xf dir1.tar.gz

tar

tar --help

Usage: tar [OPTION...] [FILE]...   这里的FILE是要准备要压缩的目录或文件
GNU `tar' saves many files together into a single tape or disk archive, and can
restore individual files from the archive.

Main operation mode:
  -c, --create                     create a new archive             新建压缩包
  -t, --list                       list the contents of an archive  列出压缩包的内容
  -x, --extract, --get             extract files from an archive    解压

Other options:
  -f, --file=ARCHIVE               use archive file or device ARCHIVE 后面接新建压缩包的名称
  -z, --gzip                       filter the archive through gzip    内部调用gzip进行压缩
  -v, --verbose                    verbosely list files processed
  -C, --directory=DIR              change to directory DIR            解压到指定目录
Examples:
  tar -zcf archive.tar.gz dir1/  # Create archive.tar.gz from files dir1/
  tar -tvf archive.tar.gz             # List all files in archive.tar.gz verbosely
  tar -xf archive.tar.gz              # Extract all files from archive.tar.gz

tar --gunzip --create --file=hello.tar.gz hello/
[root@node1 tartest]# file hello.tar.gz 
hello.tar.gz: gzip compressed data, from Unix, last modified: Sat Mar 14 22:36:21 2020

01
=================================
# tar cvf ./xxx.test.tar /tmp/ceph-ansible
# tar tf ./xxx.test.tar | head
tmp/ceph-ansible/
tmp/ceph-ansible/group_vars/
tmp/ceph-ansible/group_vars/rgws.yml.sample
tmp/ceph-ansible/group_vars/mdss.yml.sample
tmp/ceph-ansible/group_vars/mgrs.yml.sample
tmp/ceph-ansible/group_vars/rhcs.yml.sample
tmp/ceph-ansible/group_vars/mons.yml.sample
tmp/ceph-ansible/group_vars/zone.yml.sample

可以看到这样搞出来,解压后根目录是 tmp,而我们如果这样
# tar cvf ./xxx.test.tar -C /tmp ceph-ansible
# tar tf ./xxx.test.tar | head
ceph-ansible/
ceph-ansible/group_vars/
ceph-ansible/group_vars/rgws.yml.sample
ceph-ansible/group_vars/mdss.yml.sample
ceph-ansible/group_vars/mgrs.yml.sample
ceph-ansible/group_vars/rhcs.yml.sample
ceph-ansible/group_vars/mons.yml.sample

这样解压后的根目录直接是  ceph-ansible ,一般情况下,这样是我们想要的

gzip gunzip

man gzip
gzip 用来压缩文件,只能压缩文件不能直接压缩目录,需要用tar先打包,然后再用gzip来压缩,不过更常见的做法是如前文所示,直接在tar命令里使用-z参数,打包压缩二合一,一步到位

用gzip来压缩文件,会直接原地处理文件,原始文件不再保留,而是替换成新的带有 .gz 后缀的文件,解压单独使用gzip压缩的文件,需要使用gunzip来解压,不能使用 tar xf 来解压

gzip这个命令并没有太多使用的场景,通常即便是只压缩一个文件,我们也是用 tar zcf

[root@node1 tartest]# for i in {1..5}; do echo $i > ${i}.txt; done
[root@node1 tartest]# ls 
1.txt  2.txt  3.txt  4.txt  5.txt
[root@node1 tartest]# gzip *
[root@node1 tartest]# ls
1.txt.gz  2.txt.gz  3.txt.gz  4.txt.gz  5.txt.gz
[root@node1 tartest]# file 1.txt.gz 
1.txt.gz: gzip compressed data, was "1.txt", from Unix, last modified: Sat Mar 14 22:41:22 2020
[root@node1 tartest]# gunzip *
[root@node1 tartest]# ls
1.txt  2.txt  3.txt  4.txt  5.txt
[root@node1 tartest]# zcat 1.txt.gz 
1

[root@node1 tartest]# ls
1.txt  2.txt  3.txt  4.txt  5.txt
[root@node1 tartest]# gzip -v  *.txt
1.txt:	-100.0% -- replaced with 1.txt.gz
2.txt:	-100.0% -- replaced with 2.txt.gz
3.txt:	-100.0% -- replaced with 3.txt.gz
4.txt:	-100.0% -- replaced with 4.txt.gz
5.txt:	-100.0% -- replaced with 5.txt.gz

zip unzip

zip 格式的压缩文件是windows和linux通用的格式,可以直接压缩文件和目录

不过这个命令的实际使用场景还是较少,所有Linux操作系统我们基本都用 .tar.gz 压缩就够了, Mac OS X 系统一样可以用 .tar.gz,windows上随便下载个压缩工具各类压缩格式也都支持,不过 zip 格式的压缩包仍然是常见的格式,有时候别人扔给你一个 zip 压缩包或者自己从网上下载一个 zip 压缩包,也需要拿到Linux上去解压

unzip 是用来解压zip压缩包的,这两个命令系统中默认不一定有,可使用yum直接安装

yum install zip unzip


使用示例
-r   recurse into directories

zip -r dir.zip dir/
[root@node1 ziptest]# file dir.zip 
dir.zip: Zip archive data, at least v1.0 to extract

unzip dir.zip 
-q  quiet mode (-qq => quieter)   Just be quiet!
-d  extract files into exdir      解压到指定目录

unzip -q /web-arch-shell/dedecms.zip -d /code/