Linux常见的压缩命令
Compress
非常老旧的UNIX系统上的压缩软件, 了解即可, 需先安装ncompress
yum install ncompress
gzip, zcat
gzip是应用最广的压缩命令(替代compress, 并提供更好的压缩比), gzip可以解开compress, zip与gzip等软件所压缩的文件
gzip [-cdtv#] 文件名
zcat 文件名.gz
-c: 将压缩的数据输出到屏幕上, 可通过数据流重定向来处理
-d: 解压缩
-t: 可以用来检验一个压缩文件的一致性, 看看文件有无错误
-v: 可以显示出原文件/压缩文件的压缩比等信息
-#: 压缩等级, -1最快, 但压缩比最差, -9最慢, 但是压缩比最好, 默认为-6
示例:
gzip /tmp/man.config 压缩文件, 会将原文件压缩成man.config.gz, 原文件就不再存在了
zcat /tmp/man.config.gz zcat可以查看被压缩的纯文本文件
gzip -d /tmp/man.config.gz 解压缩, 压缩包就不再存在了
gzip -c man.config > man.config.gz 这种方式会保留原文件
bzip2, bzcat
bzip2是为了取代gzip并提供更佳的压缩比, 用法与gzip几乎相同
bzip2 [-cdkzv#] 文件名
bzcat 文件名.bz2
-c: 将压缩过程中产生的数据输出到屏幕上
-d: 解压缩
-k: 保留原文件
-z: 压缩
-v: 显示压缩比等信息
-#: 同gzip, 压缩比的参数
示例:
bzip2 -z man.config
bzcat man.comfig.bz2
bzip2 -d man.config.bz2
bzip2 -c man.config > man.config.bz2
打包命令: tar
tar可以将多个目录或文件打包成一个大文件, 同时可以通过gzip/bzip2的支持, 将该文件同时进行压缩, win的winRAR也支持.tar.gz文件名的解压缩
tar
打包与压缩
tar [-j][-z] [cv] [-f 新建的文件名] filename ...
查看文件名
tar [-j][-z][tv] [-f 新建的文件名]
解压缩
tar [-j][-z] [xv] [-f 新建的文件名] [-C 目录]
-c: 新建打包文件, 可搭配-v来查看过程中被打包的文件名
-t: 查看打包文件的内容含有哪些文件名, 重点在查看文件名
-x: 解打包或解压缩, 可搭配-C在特定目录解开
注意: -c, -t, -x不可同时出现在一串命令行中
-j: 通过bzip2的支持进行压缩/解压缩, 此时文件名最好为*.tar.bz2
-z: 通过gzip的支持进行压缩/解压缩, 此时文件名最好为*.tar.gz
-v: 在压缩/解压缩的过程中, 将正在处理的文件名显示出来
-f filename: -f后接要被处理的文件名, 建议-f单独写一个参数
-C 目录: 在特定目录解压缩
其他
-p: 保留备份数据的原本权限与属性, 常用于备份(-c)重要的配置文件
-P: 保留绝对路径, 即允许备份数据中含有根目录存在
--exclude=FILE: 在压缩的过程中排除FILE
简单化:
压缩: tar -jcv -f filename.tar.bz2
查询: tar -jtv -f filename.tar.bz2
解压缩: tar -jxv -f filename.tar.bz2 -C 解压缩的目录
示例:
备份/etc目录
tar -jcvp -f /tmp/etc_backup.tar.bz2 /etc
查看tar文件的数据内容
root@DESKTOP-LMORNNS:/tmp# tar -jtv -f ./etc_backup.tar.bz2 | head
drwxr-xr-x root/root 0 2022-07-17 12:08 etc/
-rw-r--r-- root/root 14464 2020-02-17 07:20 etc/services
-rw-r--r-- root/root 104 2022-02-17 08:44 etc/lsb-release
drwxr-xr-x root/root 0 2022-03-25 06:18 etc/vulkan/
drwxr-xr-x root/root 0 2020-02-10 23:17 etc/vulkan/explicit_layer.d/
drwxr-xr-x root/root 0 2020-02-10 23:17 etc/vulkan/icd.d/
drwxr-xr-x root/root 0 2020-02-10 23:17 etc/vulkan/implicit_layer.d/
drwxr-xr-x root/root 0 2022-05-05 18:59 etc/docker/
-rw------- root/root 244 2022-05-05 18:59 etc/docker/key.json
-rw-r--r-- root/root 2932 2013-04-02 05:29 etc/protocols
可以看到备份的文件会去掉根目录, 若压缩包在tmp解开, 则文件名会变成/tmp/etc/xxx
若有根目录, 则解压缩后的文件会覆盖/etc的内容, 不安全
解压缩
tar -jxv -f ./etc_backup.tar.bz2 -C /tmp
解压缩单个文件
1.在压缩包中找到对应的文件名
tar -jtv -f ./etc_backup.tar.bz2 |grep 'shadow'
2.解压缩, 注意文件名不带根目录
tar -jxv -f ./etc_backup.tar.bz2 etc/shadow
打包目录, 但是排除某些文件
tar -jcv -f ./etc_backup.tar.bz2 --exclude=/etc/shadow* /etc
更多演示
先复习下文件的时间参数:
- mtime: 文件的修改时间
- ctime: 文件的状态(权限或属性)被改变时会修改的时间
- atime: 文件被访问时会修改的时间
仅备份比某个时刻还要新的文件
参数:
--newer-mtime: 仅指定mtime
--newer: 表示后续的日期包含mtime与ctime
1. 先通过find找出比/etc/passwd还要新的文件
find /etc -newer /etc/passwd
以及查看passwd的时间参数
root@DESKTOP-LMORNNS:/tmp# ll /etc/passwd
-rw-r--r-- 1 root root 1643 Apr 29 15:49 /etc/passwd
2. 仅备份/etc下比/etc/passwd还新的文件
tar -jcvp -f /tmp/etc_backup2.tar.bz2 --newer-mtime="2022/04/29" /etc/*
3. 查看打包的文件, grep -v '/$'可以查看非/结尾的文件名
root@DESKTOP-LMORNNS:/tmp# tar -jtv -f etc_backup2.tar.bz2 |grep -v '/$'
lrwxrwxrwx root/root 0 2022-07-11 22:45 etc/alternatives/locate -> /usr/bin/mlocate
lrwxrwxrwx root/root 0 2022-05-05 18:10 etc/alternatives/cc -> /usr/bin/gcc
lrwxrwxrwx root/root 0 2022-05-05 18:10 etc/alternatives/c++ -> /usr/bin/g++
lrwxrwxrwx root/root 0 2022-05-05 18:10 etc/alternatives/cpp -> /usr/bin/cpp
...
- 打包的文件.tar, 称呼为tarfile, 如果还进行了压缩, 如.tar.bz2, 我们称呼为tarball
- 特殊应用
完整备份工具: dump
dump
- dump可以指定备份的等级
- dump命令使用 ```shell dump [-Suvj] [-level] [-f 备份文件] 待备份数据
-S: 仅列出后面的待备份数据需要多少磁盘空间才能够备份完毕 -u: 将这次dump的时间记录到/etc/dumpdateS文件中 -v: 显示dump过程 -j: 加入bzip2支持, 对数据进行压缩, 默认压缩等级为2 -level: 从-0~-9共10个等级 -f: 后接备份文件 -W: 列出在/etc/fstab里面的具有dump设置的分区是否有备份过
- 使用dump备份单一文件系统时, 可以使用完整的dump功能
![image.png](https://cdn.nlark.com/yuque/0/2022/png/281275/1658146579847-02c7a3e9-85d0-479e-9075-f65c6b298601.png#clientId=u6806730f-560e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=1308&id=u36d1e875&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1308&originWidth=662&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1141437&status=done&style=none&taskId=u89ed4f05-8f10-4765-a686-8d78e42a780&title=&width=662)
- 使用dump备份目录, 并非单一文件系统
- 所有备份数据都必须要在该目录下面
- 且仅能使用level 0 , 即仅支持完整备份
- 不支持-u参数, 即无法创建/etc/dumpdates这个level备份的时间记录文件
- ![image.png](https://cdn.nlark.com/yuque/0/2022/png/281275/1658146708858-e0cdb891-d1ba-45b1-9685-5d22ee13f62e.png#clientId=u6806730f-560e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=429&id=u178d3701&margin=%5Bobject%20Object%5D&name=image.png&originHeight=429&originWidth=615&originalType=binary&ratio=1&rotation=0&showTitle=false&size=347954&status=done&style=none&taskId=u050a5251-67f9-44d2-8ac0-465b8a2132e&title=&width=615)
<a name="TZ3k1"></a>
### restore
dump的恢复使用restore这个命令
```shell
查看dump文件
restore -t [-f dumpfile] [-h]
比较dump与实际文件
restore -C [-f dumpfile] [-D 挂载点]
进入互动模式
restore -i [-f dumpfile]
还原整个文件系统
restore -r [-f dumpfile]
以上四种模式不能混用, 参数如下:
-t: 此模式查看dump文件中有什么重要数据, 类似tar -c
-C: 此模式可以将dump内的数据拿出来跟实际的文件系统做比较
最终会列出在dump文件内有记录的, 且目前文件系统不一样的文件
-i: 进入互动模式, 可以仅还原部分文件, 用在dump目录的还原
-r: 用来将整个文件系统还原
-h: 查看完整备份数据中的inode与文件系统label等信息
-f: 后接dump文件
-D: 与-C进行搭配, 可以查出后面的挂载点与dump内有不同的文件
- 用restore查看dump后的备份数据内容
- 比较差异并还原整个文件系统
- 仅还原部分文件的restore互动模式
其他常见的压缩与备份工具
dd
- tar可以来备份关键数据, 而dd则可以用来备份整块分区或整块磁盘
- dd可以读取磁盘设备的内容(几乎是直接读取扇区), 然后将整个设备备份成一个文件
cpio
- 可以备份任何东西, 包括设备文件
- 但需配合类似find等命令