文件管理 - Linux系统压缩打包

1. 压缩工具概述

windows下我们接触最多的压缩文件就是.rar格式, 但Linux有自己所特有的压缩工具。

如果希望windows和Linux互相能使用的压缩工具, 建议.zip格式

压缩的好处

压缩的好处主要有:

  1. 节省磁盘空间占用率
  2. 节省网络传输带宽消耗
  3. 网络传输更加快捷

Linux系统常见的后缀名所对应的压缩工具

后缀名 压缩工具 说明
.gz gzip gzip压缩工具压缩的文件
.bz2 bzip2 bzip2压缩工具压缩的文件
.tar tar tar没有压缩功能,只是把一个目录合并成一个文件
.tar.gz tar + gzip 先使用tar打包,然后使用gzip压缩归档
.tar.bz2 tar + bzip2 先使用tar打包,然后使用bzip2压缩归档
.tar.xz tar + xz 先使用tar打包,然后使用xz压缩归档

注意:

  1. Linux下常用压缩文件以.tar.gz结尾
  2. Linux下压缩文件必须带后缀

2. ZIP压缩工具

zip是压缩工具,unzip是解压缩工具

2.1 压缩文件

1
2
3
4
5
# 压缩文件为zip包
[root@liyanzhao ~]# zip filename.zip filename

# 压缩目录为zip包
[root@liyanzhao ~]# zip -r dir.zip dir/

2.2 解压文件

1
2
3
4
5
# 解压zip文件包, 默认解压至当前目录
[root@liyanzhao ~]# unzip filename.zip

# 解压到指定目录
[root@liyanzhao ~]# unzip filename.zip -d /target/directory

2.3 ZIP常用选项

选项 功能
-r 递归压缩目录
-q 安静模式,不显示压缩过程
-v 显示详细信息
-d 解压到指定目录

3. TAR压缩工具

tar是linux下最常用的压缩与解压缩, 支持文件和目录的压缩归档

3.1 TAR语法

1
tar [-zjxcvfpP] filename

3.2 TAR常用参数

参数 功能
c 创建新的归档文件
x 对归档文件解包
t 列出归档文件里的文件列表
v 输出命令的归档或解包的过程
f 指定包文件名,多参数f写最后
C 指定解压目录位置
z 使用gzip压缩归档后的文件(.tar.gz)
j 使用bzip2压缩归档后的文件(.tar.bz2)
J 使用xz压缩归档后的文件(tar.xz)
X 排除多个文件(写入需要排除的文件名称)
h 打包软链接
--hard-dereference 打包硬链接
--exclude 在打包的时候写入需要排除文件或目录

3.3 常用打包与压缩组合

组合 功能
czf 打包tar.gz格式
cjf 打包tar.bz2格式
cJf 打包tar.xz格式
zxf 解压tar.gz格式
jxf 解压tar.bz2格式
xf 自动选择解压模式
tf 查看压缩包内容

3.4 将文件或目录进行打包压缩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 以gzip归档方式打包并压缩
tar czf test.tar.gz test/ test2/

# 以bz2方式压缩
tar cjf test.tar.bz2 dir.txt dir/

# 打包链接文件,打包链接文件的真实文件
[root@liyanzhao ~]# cd /
[root@liyanzhao /]# tar czfh local.tar.gz etc/rc.local

# 打包/tmp下所有文件(方法1)
[root@liyanzhao ~]# cd /
[root@liyanzhao /]# find tmp/ -type f | xargs tar czf tmp.tar.gz

# 打包/tmp下所有文件(方法2)
[root@liyanzhao /]# tar czf tmp.tar.gz $(find tmp/ -type f)

3.5 排除文件, 并打包压缩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 排除单个文件
[root@liyanzhao /]# tar czf etc.tar.gz --exclude=etc/services etc/

# 排除多个文件
[root@liyanzhao /]# tar czf etc.tar.gz --exclude=etc/services --exclude=etc/rc.local etc/

# 将需要排除的文件写入文件中
[root@liyanzhao /]# cat paichu.list
etc/services
etc/rc.local
etc/rc.d/rc.local

# 指定需要排除的文件列表, 最后进行打包压缩
[root@liyanzhao /]# tar czfX etc.tar.gz paichu.list etc/

3.6 查看压缩文件

1
2
3
4
5
# 查看压缩包内容和解压
[root@liyanzhao /]# tar tf test.tar.gz

# 详细列出压缩包内容
[root@liyanzhao /]# tar tvf test.tar.gz

3.7 解压缩文件

1
2
3
4
5
# 解包或者解压缩
[root@liyanzhao /]# tar xf test.tar.gz

# 将tar.gz解压至其他目录
[root@student ~]# tar xf /etc/local.tar.gz -C /tmp

注意: 不管是打包还是解包,原文件是不会被删除的,但会覆盖当前已经存在的文件或者目录。


4. TAR实践案例

4.1 基础环境准备

1
2
3
4
5
6
7
8
# 安装MariaDB
[root@localhost ~]# yum install mariadb-server

# 启动MariaDB服务
[root@localhost ~]# systemctl start mariadb

# 创建备份目录
[root@localhost ~]# mkdir /backup

4.2 案例1: MySQL物理备份及恢复

备份方法1: 打包整个mysql目录

1
2
3
4
5
# 备份MySQL数据目录
[root@localhost ~]# tar cJf /backup/mysql.tar.xz /var/lib/mysql

# 恢复MySQL数据
[root@localhost ~]# tar xf /backup/mysql.tar.xz -C /

备份方法2: 进入目录打包

1
2
3
4
5
6
7
8
9
10
11
# 进入MySQL数据目录
[root@localhost ~]# cd /var/lib/mysql

# 打包当前目录所有文件
[root@localhost mysql]# tar cJf /backup/mysql.tar.xz *

# 查看打包内容
[root@localhost mysql]# tar tf /backup/mysql.tar.xz

# 恢复MySQL数据
[root@localhost mysql]# tar xf /backup/mysql.tar.xz -C /var/lib/mysql

4.3 案例2: 本地文件快速传输

场景: host A /etc (海量小文件) –> host A /tmp

1
2
# 使用管道方式打包和解压,无需生成中间文件
[root@localhost ~]# tar czf - /etc | tar xzf - -C /tmp

命令说明:

  • tar czf - /etc: 将/etc目录打包压缩,输出到标准输出(-)
  • |: 管道符,将输出传递给下一个命令
  • tar xzf - -C /tmp: 从标准输入(-)读取数据,解压到/tmp目录

4.4 案例3: 跨主机文件传输

场景: host A /etc (海量小文件) –> host B /tmp

方法1: 常规方法(使用scp)

1
2
# 常规方法
[root@hostA ~]# scp -r /etc root@192.168.69.113:/tmp

缺点:

  • 传输大量小文件时速度慢
  • 需要先打包再传输,占用磁盘空间

方法2: 建议方法(使用nc+tar管道)

优势:

  • 无需生成中间文件,节省磁盘空间
  • 传输速度快,适合海量小文件
  • 实时传输,边打包边传输

步骤:

接收方B主机:

1
2
3
4
5
# 停止防火墙(或开放8888端口)
[root@hostB ~]# systemctl stop firewalld.service

# 监听8888端口,接收数据并解压
[root@hostB ~]# nc -l 8888 | tar -xzf - -C /tmp

发送方A主机:

1
2
3
# 打包压缩并通过nc发送到B主机
[root@hostA ~]# tar -czf - /etc | nc 192.168.69.113 8888
tar: Removing leading `/' from member names

命令说明:

  • tar -czf - /etc: 打包压缩/etc目录,输出到标准输出
  • |: 管道符
  • nc 192.168.69.113 8888: 通过netcat发送到目标主机8888端口
  • nc -l 8888: 在目标主机监听8888端口
  • tar -xzf - -C /tmp: 从标准输入解压到/tmp目录

完整传输流程:

1
2
3
4
5
# 在hostB上执行(接收端)
[root@hostB ~]# nc -l 8888 | tar -xzf - -C /tmp

# 在hostA上执行(发送端)
[root@hostA ~]# tar -czf - /etc | nc 192.168.69.113 8888

4.5 案例4: 带进度显示的传输

如果需要显示传输进度,可以使用pv命令:

1
2
3
4
5
6
7
8
# 安装pv工具
yum install -y pv

# 发送端(显示进度)
tar -czf - /etc | pv | nc 192.168.69.113 8888

# 接收端
nc -l 8888 | pv | tar -xzf - -C /tmp

4.6 案例5: 压缩级别选择

1
2
3
4
5
6
7
8
9
10
11
# gzip压缩(默认级别6,速度与压缩比平衡)
tar czf archive.tar.gz /path/to/dir

# bzip2压缩(压缩比高,速度慢)
tar cjf archive.tar.bz2 /path/to/dir

# xz压缩(压缩比最高,速度最慢)
tar cJf archive.tar.xz /path/to/dir

# 指定gzip压缩级别(1-9,9最高)
tar czf archive.tar.gz --use-compress-program="gzip -9" /path/to/dir

5. 压缩工具对比

5.1 压缩比和速度对比

压缩格式 压缩比 压缩速度 解压速度 适用场景
.tar.gz 中等 日常使用,平衡选择
.tar.bz2 较高 中等 需要较高压缩比
.tar.xz 最高 最慢 需要最高压缩比,存储空间有限
.zip 中等 中等 中等 Windows/Linux兼容

5.2 选择建议

  • 日常使用: 推荐.tar.gz,速度快,压缩比适中
  • 长期归档: 推荐.tar.xz,压缩比最高
  • 跨平台: 推荐.zip,兼容性好
  • 大量小文件: 推荐使用管道方式,避免中间文件

6. 常用命令总结

6.1 ZIP命令总结

1
2
3
4
5
6
7
8
9
10
# 压缩
zip -r archive.zip /path/to/dir
zip archive.zip file1 file2

# 解压
unzip archive.zip
unzip archive.zip -d /target/dir

# 查看
unzip -l archive.zip

6.2 TAR命令总结

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 打包压缩
tar czf archive.tar.gz /path/to/dir # gzip压缩
tar cjf archive.tar.bz2 /path/to/dir # bzip2压缩
tar cJf archive.tar.xz /path/to/dir # xz压缩

# 解压
tar xzf archive.tar.gz # 解压tar.gz
tar xjf archive.tar.bz2 # 解压tar.bz2
tar xf archive.tar.* # 自动识别格式

# 查看
tar tf archive.tar.gz # 列出内容
tar tvf archive.tar.gz # 详细列出

# 排除文件
tar czf archive.tar.gz --exclude=pattern /path
tar czfX archive.tar.gz exclude.list /path

# 指定解压目录
tar xf archive.tar.gz -C /target/dir

6.3 管道传输命令

1
2
3
4
5
6
7
8
9
# 本地快速复制
tar czf - /source | tar xzf - -C /target

# 跨主机传输
# 接收端
nc -l 8888 | tar xzf - -C /target

# 发送端
tar czf - /source | nc target_host 8888

7. 实战练习

练习1: 基础压缩打包

1
2
3
4
5
6
7
8
9
10
11
12
# 1. 创建测试目录和文件
mkdir -p /tmp/test/{dir1,dir2}
touch /tmp/test/{file1,file2,dir1/file3,dir2/file4}

# 2. 打包压缩为tar.gz
tar czf /tmp/test.tar.gz /tmp/test

# 3. 查看压缩包内容
tar tf /tmp/test.tar.gz

# 4. 解压到指定目录
tar xzf /tmp/test.tar.gz -C /tmp/restore

练习2: 排除文件打包

1
2
3
4
5
6
7
8
9
10
11
12
# 1. 创建排除文件列表
cat > /tmp/exclude.list <<EOF
*.log
*.tmp
test/
EOF

# 2. 使用排除列表打包
tar czfX /tmp/backup.tar.gz /tmp/exclude.list /etc

# 3. 验证排除的文件
tar tf /tmp/backup.tar.gz | grep -E '\.(log|tmp)'

练习3: MySQL备份恢复

1
2
3
4
5
6
7
8
9
10
11
# 1. 备份MySQL数据
systemctl stop mariadb
tar cJf /backup/mysql-$(date +%Y%m%d).tar.xz /var/lib/mysql
systemctl start mariadb

# 2. 恢复MySQL数据
systemctl stop mariadb
rm -rf /var/lib/mysql/*
tar xf /backup/mysql-20240130.tar.xz -C /
chown -R mysql:mysql /var/lib/mysql
systemctl start mariadb

练习4: 跨主机传输

1
2
3
4
5
# 主机A(发送端)
tar czf - /etc | nc 192.168.1.100 8888

# 主机B(接收端)
nc -l 8888 | tar xzf - -C /tmp/etc-backup

8. 注意事项

8.1 路径问题

1
2
3
4
5
6
7
8
9
# 绝对路径打包(会包含完整路径)
tar czf backup.tar.gz /etc

# 相对路径打包(只包含相对路径)
cd /
tar czf backup.tar.gz etc/

# 使用-C参数改变工作目录
tar czf backup.tar.gz -C / etc

8.2 权限问题

1
2
3
4
5
6
7
8
# 打包时保留权限
tar czf backup.tar.gz /etc

# 解压时保留权限(默认)
tar xzf backup.tar.gz

# 解压时不保留权限
tar xzf backup.tar.gz --no-same-permissions

8.3 大文件处理

1
2
3
4
5
# 分卷压缩(每卷1GB)
tar czf - /large/dir | split -b 1G - backup.tar.gz.

# 合并分卷并解压
cat backup.tar.gz.* | tar xzf -