Chapter 12 压缩打包
12.1 确定文件类型
下面列出了几种常见的压缩文件的扩展名:
*.Z compress程序压缩的文件
*.zip zip压缩文件
*.gz gzip压缩文件
*.bz2 bzip2压缩文件
*.xz xz压缩文件
*.tar tar打包文件,无压缩
*.tar.gz
*.tar.bz2 *.tar.xz
然而文件扩展名与文件类型并无直接关系,我们可以使用file
命令查看文件类型:
[root@Cent-KVM ~]# file testfile
testfile: gzip compressed data
Linux下也可以很方便地查看文件头,来判断文件类型
12.2 zip
zip是一种经典的压缩方式,文件头是504B0304,504B的ASCII对应为PK
[root@Cent-KVM ~]# od -t x testfile.zip
0000000 04034b50
[root@Cent-KVM ~]# head -n 1 testfile.zip
PK
zip [选项] 输出文件 输入文件
-r :递归压缩目录
yum -y install unzip
unzip [选项] zip_file
-b dir : 解压到指定目录
-l :查看文件中的内容而不解压文件
12.3 gzip
gz是由GNU计划所开发出来的压缩命令,应用十分广泛。许多网页就使用了gz压缩加快传输。
文件头共10字节,包含幻数、版本号、时间戳。其中ID1、ID2是固定的,CM压缩算法目前仅一种
故gz文件总以1F8B08
开始
[root@Cent-KVM ~]# od -t x test.gz
0000000 08088b1f
gzip [选项] file
-v 显示压缩比等信息
-r 分别压缩目录中的每个文件
-d 解压gz文件
-c –stdout,输出到屏幕,可以重定向
-l 列出信息
注意gzip压缩或解压会替换掉原文件,而使用stdout则不会删除
如果不想删除原文件,可以:
gzip -c test.txt > test.gz
还可以指保存的路径
gzip -dc test.gz > /home/test.txt
12.6 cat/more/less/grep
如果gzip, bzip2, xz压缩的是文本文件,那么可以直接通过对应的命令读取文件的内容
例如:
[root@Cent-KVM ~]# bzcat test.txt.bz2
111
222
[root@Cent-KVM ~]# xzless passwd.xz
[root@Cent-KVM ~]# zgrep 'cent' passwd.gz
cent:x:1000:1000:cent:/home/cent:/bin/bash
12.7 tar
gzip, bzip2, xz 这些命令压缩的对象都是文件,如果要将整个目录压缩,就要配合tar生成打包文件(tarfile)再生成压缩文件(tarball)
tar命令的选项非常之多
例如:
压缩:tar -cJvf file1.tar.xz 原文件
查询:tar -tjvf file2.tar.bz2
解压:tar -xzvf file3.tar.gz -C 解压目录
互斥项:
操作:
-c 创建打包文件 -x 解包 -t 查看打包文件的内容
压缩方式:
-z gzip -j bzip2 -J xz
解压目录:
-C dir 用于解压缩,指定解压目录 -P 压缩或解压时不去除路径开头的/,即使用绝对路径
其他常用选项:
-v 处理时显示正在处理的文件名 -f filename 接要被处理的文件名 -p 提取有关文件权限的信息(default for superuser) --exclude=FILE 打包时排除文件
实例:
总结:使用绝对路径打包和解压
压缩:
tar -cPzvf test1.tar.gz /root/test
解压:
tar -xPzvf test1.tar.gz
三个条件(压缩时原文件用绝对路径表示,压缩、解压都带-P选项)缺一不可,否则会解压到当前路径
当然,这样做是比较危险的,容易覆盖的一些重要文件
排除指定目录/文件:
tar --exclude=[目录名/*|文件名] -czvf filename.tar.gz 目录名
注意 -f 要紧跟文件名,exclude可以方放前面,不要把它俩隔开
仅解压指定文件
[root@Cent-KVM ~]# tar -tzvf backup.tar.gz | grep passwd -rw-r--r-- root/root 889 2021-11-22 17:35 backup/passwd [root@Cent-KVM ~]# tar -xzvf backup.tar.gz backup/passwd backup/passwd
备份指定日期之后的文件
tar cjvf /root/etc.tar.bz2 --newer-mtime="2020/02/02" /etc/*
打包到特殊位置:
磁带(
/dev/st0
)tar -cvf /dev/st0 /root /home /etc
管道
cd /tmp tar -cvf - /etc | tar -xvf -
两个
-
分别代表stdout, stdin
12.8 dd
dd if="input" of="output" bs="block_size" count="n"
举例:
备份一个文件,bs默认512Bytes
dd if=/etc/passwd of=/tmp/passwd.bak
从光盘上备份出iso镜像
dd if=/dev/sr0 of=/tmp/system.iso
iso镜像刻录到U盘
dd if=/tmp/system.iso of=/dev/sda
备份boot分区
dd if=/dev/vda2 of=/tmp/boot.img
12.9 光盘镜像
12.9.1 mkisofs
yum -y install genisoimage
在CentOS 7,此时mkisofs和genisoimage是等价的
/usr/bin/mkisofs -> /etc/alternatives/mkisofs -> /usr/bin/genisoimage
genisoimage [options] [-o filename] pathspec [pathspec …]
-r 通过Rock River产生支持UNIX/Linux的文件数据,可记录UID/GID等信息
-v verbose
-V volid Specifies the volume ID (volume name or label)
-m file 排除文件
mkisofs -r -v -o etc.img /etc
这样可以把/etc
下所有文件写入镜像文件顶层目录中
如果要写入来自不同目录的一些文件,可以使用-graft-point
,以把他们放入镜像的不同目录
mkisofs -r -V 'linux file' -o system.img -graft-point /root.bak=/root /etc.bak=/etc