确定文件类型

下面列出了几种常见的压缩文件的扩展名:

1
2
3
4
5
6
7
8
9
*.Z			compress程序压缩的文件
*.zip zip压缩文件
*.gz gzip压缩文件
*.bz2 bzip2压缩文件
*.xz xz压缩文件
*.tar tar打包文件,无压缩
*.tar.gz
*.tar.bz2
*.tar.xz

然而文件扩展名与文件类型并无直接关系,可以使用file命令查看文件类型:

1
2
[root@Cent-KVM ~]# file testfile 
testfile: gzip compressed data

Linux下也可以很方便地查看文件头,来判断文件类型

zip

zip是一种经典的压缩方式,文件头是504B0304,504B的ASCII对应为PK

1
2
3
4
[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

    -d dir : 解压到指定目录

    -l :查看文件中的内容而不解压文件

gzip

gz是由GNU计划所开发出来的压缩命令,应用十分广泛。许多网页就使用了gz压缩。

文件头共10字节,包含幻数、版本号、时间戳。其中ID1、ID2是固定的,CM压缩算法目前仅一种

故gz文件总以1F8B08开始

1
2
[root@Cent-KVM ~]# od -t x test.gz 
0000000 08088b1f
  • gzip [选项] file

    -v 显示压缩比等信息

    -r 分别压缩目录中的每个文件

    -d 解压gz文件

    -c --stdout,输出到屏幕,可以重定向

    -l 列出信息

gzip压缩或解压会替换掉原文件,而使用stdout则不会替换

如果不想删除原文件,可以:

1
gzip -c test.txt > test.gz

还可以指保存的路径

1
gzip -dc test.gz > /home/test.txt

bzip2

bzip2提供了更好的压缩比,用法与gzip基本相同

yum -y install bzip2

  • bzip2 [选项] file

    -k 保留原文件

xz

xz的压缩比更高,但是压缩也更慢,用法与gzip和bzip2几乎相同

cat/more/less/grep

如果gzip, bzip2, xz压缩的是文本文件,那么可以直接通过对应的命令读取文件的内容

例如:

1
2
3
4
5
6
[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

tar

gzip, bzip2, xz 这些命令压缩的对象都是文件,如果要将整个目录压缩,就要配合tar生成打包文件(tarfile)再生成压缩文件(tarball)

举例:

压缩:tar -cJvf file1.tar.xz 原文件

查询:tar -tjvf file2.tar.bz2

解压:tar -xzvf file3.tar.gz -C 解压目录

互斥项:

  • 操作:

    1
    2
    3
    -c	创建打包文件
    -x 解包
    -t 查看打包文件的内容
  • 压缩方式:

    1
    2
    3
    -z	gzip
    -j bzip2
    -J xz
  • 解压目录:

    1
    2
    -C dir 	用于解压缩,指定解压目录
    -P 压缩或解压时不去除路径开头的/,即使用绝对路径

其他常用选项:

1
2
3
4
-v				处理时显示正在处理的文件名
-f filename 接要被处理的文件名
-p 提取有关文件权限的信息(default for superuser)
--exclude=FILE 打包时排除文件

实例:

  • 如何使用绝对路径打包和解压?

    压缩时原文件用绝对路径表示,压缩、解压都带-P选项

    压缩:tar -cPzvf test1.tar.gz /root/test

    解压:tar -xPzvf test1.tar.gz

    否则会解压到当前路径

  • 排除指定目录/文件:

    tar --exclude=[目录名/*|文件名] -czvf filename.tar.gz 目录名

-f 选项要紧跟文件名,exclude可以放于前面

  • 仅解压指定文件
1
2
3
4
[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

  • 管道

    1
    2
    cd /tmp
    tar -cvf - /etc | tar -xvf -

    两个-分别代表stdout, stdin

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