Linux打包压缩完全指南:从基础到高级应用

2024/07/13 Linux 系统管理 共 43341 字,约 124 分钟

Linux打包压缩完全指南:从基础到高级应用

在Linux系统管理和开发工作中,打包压缩是一项基础但至关重要的技能。无论是备份数据、分发软件、还是优化存储空间,掌握各种打包压缩工具的使用都能大幅提高工作效率。本文将全面介绍Linux环境下常用的打包压缩工具和技术,包括tar、gzip、bzip2、xz、zip等,从基本概念到高级应用,帮助您精通Linux打包压缩操作。

1. 打包与压缩的基础概念

1.1 什么是打包和压缩

在开始学习具体工具之前,我们需要明确打包和压缩这两个概念的区别:

打包(Archiving):

  • 将多个文件或目录合并成一个单一的文件,便于传输和存储
  • 打包本身不会减小文件体积
  • 主要工具:tar

压缩(Compression):

  • 通过特定算法减小文件体积,节省存储空间
  • 可以压缩单个文件或打包后的文件
  • 主要工具:gzip、bzip2、xz、zip等

1.2 常用压缩格式及其特点

Linux环境中最常见的压缩格式有:

格式 扩展名 压缩工具 特点 压缩率 速度
gzip .gz gzip/gunzip 最常用,广泛支持 中等
bzip2 .bz2 bzip2/bunzip2 较高压缩率 中等
xz .xz xz/unxz 最高压缩率 最高 较慢
zip .zip zip/unzip 跨平台兼容 中等 中等
z .Z compress/uncompress 老式格式,较少使用

1.3 打包压缩在Linux中的应用场景

  • 数据备份:将重要文件打包压缩后备份,节省空间
  • 软件分发:将软件源代码或二进制文件打包压缩供用户下载
  • 日志归档:将历史日志文件打包压缩,便于长期存储
  • 网络传输:减小文件体积,加快传输速度
  • 版本控制:将项目文件打包,便于版本管理
  • 系统维护:在系统维护过程中打包重要配置文件

2. tar命令 - Linux打包的瑞士军刀

2.1 tar命令基础

tar(Tape ARchive)是Linux系统中最常用的打包工具,它可以将多个文件或目录打包成一个文件,也可以通过与其他压缩工具结合实现压缩功能。

基本语法:

tar [选项] [归档文件名] [要打包的文件或目录]

12.4 案例:多文件打包实践

以下案例展示了如何使用tar命令同时打包多个文件:

# 创建测试文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ echo f1 > f1.txt 
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ echo f2 > f2.txt 

# 打包多个文件到test.tar
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar -cvf test.tar f1.txt f2.txt 
 f1.txt 
 f2.txt 

# 查看当前目录文件列表
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ ls 
 etc2.tar  etc.tar  f1.txt  f2.txt  test.tar 

# 验证归档内容
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar -tvf test.tar 
-rw-rw-r-- soveran/soveran   3 2025-11-12 19:42 f1.txt 
-rw-rw-r-- soveran/soveran   3 2025-11-12 19:42 f2.txt 

案例分析

  1. 多文件打包操作
    • tar命令允许在一个命令中打包多个文件,只需在命令行中列出所有要打包的文件名
    • 本案例中同时打包了f1.txtf2.txt两个文件到test.tar归档中
    • 使用-c选项创建新归档,-v选项显示详细信息,-f选项指定归档文件名
  2. 详细输出功能
    • -v(详细)选项在打包过程中显示了被添加到归档的文件名
    • 这有助于确认哪些文件被成功添加到归档中
    • 输出显示f1.txtf2.txt都被成功打包
  3. 归档验证
    • 使用tar -tvf命令可以查看归档的内容,验证打包是否成功
    • 输出显示归档中包含了正确的文件,并且保留了原始文件的权限、所有者、大小和修改时间等元数据
    • 可以看到两个文件的权限都是-rw-rw-r--,所有者都是soveran/soveran
  4. 归档大小考虑
    • 虽然每个文本文件的内容只有3个字节,但归档文件的大小会稍大
    • 这是因为tar归档包含了文件元数据和文件内容,有一定的开销
    • 对于小文件,这种开销会相对更明显
  5. 使用场景
    • 多文件打包适用于需要同时备份或传输多个相关文件的场景
    • 软件开发过程中打包源代码文件
    • 数据备份时合并多个配置文件或日志文件
    • 文件传输前将多个相关文件合并为一个归档,便于管理
  6. 实用建议
    • 对于大量文件,可以使用通配符(如*.txt)简化命令
    • 结合-z-j-J选项可以同时进行压缩
    • 打包前确认文件是否都在当前工作目录或使用正确的相对路径

12.5 案例:使用-C选项从特定目录创建归档

以下案例展示了如何使用tar命令的-C选项从特定目录创建归档:

# 使用-C选项从/etc/目录创建归档文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ sudo tar -C /etc/ -cf etc3.tar ./ 

# 查看当前目录文件列表
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ ll 
总计 31392 
drwxrwxr-x   3 soveran soveran    4096 11月 12 19:53 ./ 
drwxrwxr-x   6 soveran soveran    4096 11月 12 18:15 ../ 
drwxr-xr-x 139 soveran soveran   12288 11月 12 19:50 etc/ 
-rw-rw-r--   1 soveran soveran 8028160 11月 12 19:25 etc2.tar 
-rw-rw-r--   1 soveran soveran 8017920 11月 12 19:54 etc3.tar 
-rw-rw-r--   1 soveran soveran 8028160 11月 12 18:20 etc.tar 
-rw-rw-r--   1 soveran soveran 8028160 11月 12 19:51 etc.tar.gz 
-rw-rw-r--   1 soveran soveran       3 11月 12 19:42 f1.txt 
-rw-rw-r--   1 soveran soveran       3 11月 12 19:42 f2.txt 
-rw-rw-r--   1 soveran soveran   10240 11月 12 19:42 test.tar 

# 查看使用-C选项创建的归档内容
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar -tf etc3.tar 
./ 
./opt/ 
./mke2fs.conf 
./wpa_supplicant/ 
./wpa_supplicant/functions.sh 
./wpa_supplicant/ifupdown.sh 
./wpa_supplicant/action_wpa.sh 
./vconsole.conf 
./magic.mime 
./newt/ 
./newt/palette.ubuntu 
./newt/palette.original 
./newt/palette 
./fprintd.conf 

案例分析

  1. -C选项功能
    • -C(或--directory)选项用于在执行tar命令前切换到指定的目录
    • 这样可以从指定目录创建归档,而不需要先使用cd命令切换目录
    • 特别适用于从其他目录打包文件但将归档保存在当前目录的场景
  2. 相对路径处理
    • 当使用-C /etc/并指定./作为源时,归档中的文件路径以./开头
    • 这与直接打包/etc目录的效果不同,后者会包含完整的路径信息
    • 使用-C选项可以更好地控制归档中的路径结构
  3. 归档大小差异
    • 注意到etc3.tar(使用-C选项创建)的大小为8017920字节,略小于直接打包的etc.tar(8028160字节)
    • 这可能是因为路径表示方式不同导致的元数据差异
    • 但总体上,内容是相同的,只是路径表示方式有所区别
  4. 权限要求
    • 处理系统目录(如/etc)时仍然需要使用sudo获取管理员权限
    • 即使使用了-C选项,访问权限的要求仍然存在
  5. 使用场景
    • 从特定目录打包文件但保持归档在当前目录
    • 控制归档中的路径结构,避免包含过长的路径前缀
    • 在脚本中打包不同目录的文件而不需要频繁切换目录
  6. 实用建议
    • 结合-v选项使用-C可以在执行过程中看到详细的路径信息
    • 对于复杂的目录结构,-C选项可以帮助创建更加整洁的归档内容
    • -P选项结合使用时需要注意路径表示的最终效果

12.6 案例:归档不能包含自身的错误处理

以下案例展示了一个常见的tar命令错误:尝试创建的归档文件不能包含自身:

# 错误示例:在etc目录内尝试创建归档,且归档名也在etc目录内
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar/etc $ sudo tar -cf etc.tar.gz * 
tar: etc.tar.gz: archive cannot contain itself; not dumped 

# 正确示例:从外部目录打包etc目录
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ sudo tar cf etc.tar.gz etc/ 

# 查看目录列表确认归档成功创建
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ ll 
总计 23560 
drwxrwxr-x   3 soveran soveran    4096 11月 12 19:51 ./ 
drwxrwxr-x   6 soveran soveran    4096 11月 12 18:15 ../ 
drwxr-xr-x 139 soveran soveran   12288 11月 12 19:50 etc/ 
-rw-rw-r--   1 soveran soveran 8028160 11月 12 19:25 etc2.tar 
-rw-rw-r--   1 soveran soveran 8028160 11月 12 18:20 etc.tar 
-rw-rw-r--   1 soveran soveran 8028160 11月 12 19:51 etc.tar.gz 
-rw-rw-r--   1 soveran soveran       3 11月 12 19:42 f1.txt 
-rw-rw-r--   1 soveran soveran       3 11月 12 19:42 f2.txt 
-rw-rw-r--   1 soveran soveran   10240 11月 12 19:42 test.tar 

案例分析

  1. 错误原因分析
    • 当尝试在同一个目录中创建归档并将该目录的所有内容(包括将要创建的归档文件)打包时,会产生循环引用
    • tar命令检测到这种情况并拒绝执行,显示错误消息:”tar: etc.tar.gz: archive cannot contain itself; not dumped”
    • 这是tar的一种保护机制,防止创建无效或损坏的归档文件
  2. 解决方案
    • 最简单的解决方案是从父目录打包子目录,确保归档文件不位于被打包的目录内
    • 如案例中所示,从~/mage/linux-basic/tar目录执行tar cf etc.tar.gz etc/命令成功创建了归档
    • 这样归档文件etc.tar.gz位于父目录,不会被包含在自身中
  3. 替代方法
    • 如果必须在当前目录创建归档,可以使用排除选项:tar -cf archive.tar --exclude="archive.tar" *
    • 或者先创建一个临时目录,将要打包的内容复制到临时目录,然后从临时目录创建归档
    • 也可以指定具体的文件名而不是使用通配符*
  4. 最佳实践
    • 始终在被打包目录的父目录中创建归档文件
    • 使用明确的路径而不是依赖通配符,特别是在重要的备份操作中
    • 在脚本中创建归档时,确保归档文件的路径不会与被打包的内容重叠
  5. 常见错误模式
    • 在当前目录使用tar -cf backup.tar *尝试创建备份
    • 递归打包包含归档文件的目录树
    • 混淆了源目录和目标归档文件的位置关系

12.7 案例:空归档创建与自我引用警告

以下案例展示了尝试创建空归档以及打包包含自身的目录时的行为:

# 查看当前目录文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ ll 
总计 16 
drwxrwxr-x 2 soveran soveran 4096 11月 12 20:05 ./ 
drwxrwxr-x 6 soveran soveran 4096 11月 12 18:15 ../ 
-rw-rw-r-- 1 soveran soveran    3 11月 12 19:42 f1.txt 
-rw-rw-r-- 1 soveran soveran    3 11月 12 19:42 f2.txt 

# 尝试创建空归档(缺少源文件参数)
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar -cvf test.tar 
tar: 谨慎地拒绝创建空归档文件 
请用"tar --help""tar --usage"获得更多信息。 

# 验证空归档未被创建
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar -tvf test.tar 
tar: test.tar:无法 open: 没有那个文件或目录 
tar: Error is not recoverable: exiting now 

# 尝试使用当前目录(包含将要创建的归档文件)
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar cvf test.tar ./ 
./ 
tar: ./test.tar: archive cannot contain itself; not dumped 
./f1.txt 
./f2.txt 

案例分析

  1. 空归档保护机制
    • tar命令有内置保护机制,当没有指定源文件时,会拒绝创建空归档
    • 错误消息”tar: 谨慎地拒绝创建空归档文件”表明这是一种安全措施
    • 这可以防止用户意外创建无效的归档文件
    • 验证结果显示空归档文件test.tar确实没有被创建
  2. 自我引用检测
    • 当尝试打包当前目录(../)时,tar会检测到归档文件将包含自身
    • 显示警告消息:”tar: ./test.tar: archive cannot contain itself; not dumped”
    • 尽管有这个警告,tar仍然继续处理其他文件(f1.txt和f2.txt)
    • 这表明tar在发现自我引用问题时会跳过有问题的文件,但继续处理其他有效文件
  3. 命令参数分析
    • 创建归档时必须指定至少一个源文件或目录
    • 当使用-f选项指定归档文件名后,必须在命令末尾提供源文件参数
    • 空命令(没有源文件)会触发保护机制
  4. 常见错误原因
    • 忘记指定源文件路径
    • 混淆了命令参数的顺序(源文件应该在命令末尾)
    • 尝试在当前目录创建归档并包含整个当前目录
  5. 解决方案
    • 始终明确指定要打包的文件或目录
    • 对于当前目录的内容,使用具体的文件列表或排除归档文件
    • 例如:tar -cvf test.tar f1.txt f2.txt(只打包特定文件)
    • 或者:tar -cvf test.tar --exclude="test.tar" *(排除自身)
  6. 最佳实践
    • 创建归档前确认命令语法正确,包括源文件参数
    • 使用详细模式(-v)查看哪些文件被包含在归档中
    • 避免在当前目录使用通配符*创建归档,除非使用--exclude选项排除归档文件本身

**常用选项:**
- `-c`:创建新的归档文件
- `-x`:从归档文件中提取文件
- `-v`:显示操作过程(verbose)
- `-f`:指定归档文件名
- `-t`:列出归档文件中的内容
- `-z`:使用gzip压缩/解压
- `-j`:使用bzip2压缩/解压
- `-J`:使用xz压缩/解压
- `-C`:指定解压目录
- `--exclude`:排除指定文件
- `--include`:仅包含指定文件

### 2.2 tar打包操作

#### 创建基本tar包

```bash
# 创建一个名为backup.tar的归档文件,包含/etc目录下的所有文件
tar -cvf backup.tar /etc

# 创建归档文件但不显示详细信息(不使用-v选项)
tar -cf silent_backup.tar /etc

查看tar包内容

# 查看归档文件中的内容
tar -tvf backup.tar

# 查看归档文件中特定类型的文件
tar -tvf backup.tar --wildcards "*.conf"

从tar包中提取文件

# 提取归档文件中的所有内容到当前目录
tar -xvf backup.tar

# 提取归档文件到指定目录
tar -xvf backup.tar -C /tmp

# 从归档文件中提取特定文件
tar -xvf backup.tar etc/passwd

2.3 tar与压缩工具结合使用

使用gzip压缩

# 创建一个gzip压缩的tar包(.tar.gz或.tgz)
tar -czvf backup.tar.gz /etc
# 或简写为
tar -czf backup.tgz /etc

# 解压gzip压缩的tar包
tar -xzvf backup.tar.gz
# 或解压到指定目录
tar -xzvf backup.tar.gz -C /tmp

使用bzip2压缩

# 创建一个bzip2压缩的tar包(.tar.bz2)
tar -cjvf backup.tar.bz2 /etc

# 解压bzip2压缩的tar包
tar -xjvf backup.tar.bz2
# 或解压到指定目录
tar -xjvf backup.tar.bz2 -C /tmp

使用xz压缩

# 创建一个xz压缩的tar包(.tar.xz)
tar -cJvf backup.tar.xz /etc

# 解压xz压缩的tar包
tar -xJvf backup.tar.xz
# 或解压到指定目录
tar -xJvf backup.tar.xz -C /tmp

2.4 tar命令高级应用

排除文件或目录

# 打包时排除特定文件
tar -czvf backup.tar.gz --exclude="*.log" --exclude="/etc/nginx" /etc

# 从文件中读取要排除的模式列表
tar -czvf backup.tar.gz --exclude-from=exclude_list.txt /etc

增量备份

# 创建快照文件
tar -czvf backup_$(date +%Y%m%d).tar.gz -g snapshot.file /etc

# 使用快照文件创建增量备份
tar -czvf incremental_backup.tar.gz -g snapshot.file /etc

使用稀疏文件选项

# 创建支持稀疏文件的归档
tar -czvf backup.tar.gz --sparse /path/to/directory

压缩率与速度优化

# gzip压缩级别(1-9,1最快,9压缩率最高)
tar -czvf -9 backup_best.tar.gz /etc

# xz压缩级别(0-9,0最快,9压缩率最高)
tar -cJvf --xz-option=--compression-level=9 backup_best.tar.xz /etc

3. gzip命令 - 常用的压缩工具

3.1 gzip命令基础

gzip(GNU zip)是Linux系统中最常用的压缩工具之一,它可以压缩单个文件,但不能直接压缩目录。

基本语法:

gzip [选项] [文件...]
gunzip [选项] [压缩文件...]

常用选项:

  • -c:将压缩数据输出到标准输出,不改变原文件
  • -d:解压文件(等同于gunzip)
  • -f:强制压缩或解压
  • -k:保留原文件(不删除)
  • -l:列出压缩文件的信息
  • -r:递归压缩目录中的文件
  • -1-9:设置压缩级别(1最快,9压缩率最高)

3.2 gzip压缩与解压操作

# 压缩单个文件(会删除原文件)
gzip file.txt

# 压缩文件并保留原文件
gzip -k file.txt

# 指定压缩级别
gzip -9 file.txt  # 最高压缩率
gzip -1 file.txt  # 最快压缩速度

# 解压文件(会删除压缩文件)
gunzip file.txt.gz
# 或使用gzip -d
gzip -d file.txt.gz

# 解压并保留压缩文件
gunzip -k file.txt.gz

# 查看压缩文件信息
gzip -l file.txt.gz

3.3 gzip与其他命令结合使用

# 压缩多个文件
gzip file1.txt file2.txt file3.txt

# 递归压缩目录中的所有文件
gzip -r /path/to/directory

# 压缩命令输出
ls -la | gzip > directory_listing.gz

# 解压并查看压缩文件内容
gunzip -c file.txt.gz | cat

# 使用zcat直接查看压缩文件内容(无需解压)
zcat file.txt.gz

4. bzip2命令 - 更高压缩率的选择

4.1 bzip2命令基础

bzip2是一种比gzip具有更高压缩率的压缩工具,特别适合压缩大型文本文件。

基本语法:

bzip2 [选项] [文件...]
bunzip2 [选项] [压缩文件...]

常用选项:

  • -c:将压缩数据输出到标准输出,不改变原文件
  • -d:解压文件(等同于bunzip2)
  • -f:强制压缩或解压
  • -k:保留原文件(不删除)
  • -s:使用小内存模式
  • -1-9:设置压缩级别(1最快,9压缩率最高)

4.2 bzip2压缩与解压操作

# 压缩单个文件(会删除原文件)
bzip2 file.txt

# 压缩文件并保留原文件
bzip2 -k file.txt

# 指定压缩级别
bzip2 -9 file.txt  # 最高压缩率
bzip2 -1 file.txt  # 最快压缩速度

# 解压文件(会删除压缩文件)
bunzip2 file.txt.bz2
# 或使用bzip2 -d
bzip2 -d file.txt.bz2

# 解压并保留压缩文件
bunzip2 -k file.txt.bz2

# 查看压缩文件信息
bzip2 -tv file.txt.bz2

4.3 bzip2与其他命令结合使用

# 压缩多个文件
bzip2 file1.txt file2.txt file3.txt

# 压缩命令输出
ls -la | bzip2 > directory_listing.bz2

# 解压并查看压缩文件内容
bunzip2 -c file.txt.bz2 | cat

# 使用bzcat直接查看压缩文件内容(无需解压)
bzcat file.txt.bz2

5. xz命令 - 最高压缩率的选择

5.1 xz命令基础

xz是一种提供极高压缩率的压缩工具,特别适合需要最大限度节省空间的场景,但压缩和解压速度相对较慢。

基本语法:

xz [选项] [文件...]
unxz [选项] [压缩文件...]

常用选项:

  • -c:将压缩数据输出到标准输出,不改变原文件
  • -d:解压文件(等同于unxz)
  • -f:强制压缩或解压
  • -k:保留原文件(不删除)
  • -l:列出压缩文件的信息
  • -0-9:设置压缩级别(0最快,9压缩率最高)
  • -T:指定使用的线程数

5.2 xz压缩与解压操作

# 压缩单个文件(会删除原文件)
xz file.txt

# 压缩文件并保留原文件
xz -k file.txt

# 指定压缩级别
xz -9 file.txt  # 最高压缩率
xz -0 file.txt  # 最快压缩速度

# 解压文件(会删除压缩文件)
unxz file.txt.xz
# 或使用xz -d
xz -d file.txt.xz

# 解压并保留压缩文件
xz -dk file.txt.xz

# 查看压缩文件信息
xz -l file.txt.xz

5.3 xz与多线程压缩

xz支持多线程压缩,可以利用多核CPU加速压缩过程:

# 使用4个线程进行压缩
xz -T4 -9 file.txt

# 使用所有可用CPU线程
xz -T0 -9 large_file.tar

5.4 xz与其他命令结合使用

# 压缩多个文件
xz file1.txt file2.txt file3.txt

# 压缩命令输出
ls -la | xz > directory_listing.xz

# 解压并查看压缩文件内容
xz -dc file.txt.xz | cat

# 使用xzcat直接查看压缩文件内容(无需解压)
xzcat file.txt.xz

6. zip命令 - 跨平台的压缩选择

6.1 zip命令基础

zip是一种广泛使用的跨平台压缩格式,在Windows、Linux、macOS等系统上都有良好的支持。

基本语法:

zip [选项] [压缩文件名] [文件或目录...]
unzip [选项] [压缩文件] [文件...]

常用选项:

  • -r:递归压缩目录
  • -q:安静模式,不显示压缩过程
  • -m:压缩后删除原文件
  • -9:最高压缩率
  • -1:最快压缩速度
  • -e:创建加密压缩文件
  • -j:只压缩文件,不保留目录结构

6.2 zip压缩与解压操作

# 压缩单个文件
zip file.zip file.txt

# 压缩多个文件
zip files.zip file1.txt file2.txt file3.txt

# 压缩目录及其内容
zip -r directory.zip /path/to/directory

# 创建加密压缩文件
zip -e secure.zip sensitive_file.txt

# 解压文件到当前目录
unzip file.zip

# 解压文件到指定目录
unzip file.zip -d /tmp

# 不解压,仅查看压缩文件内容
unzip -l file.zip

# 解压压缩文件中的特定文件
unzip file.zip specific_file.txt

6.3 zip高级应用

# 排除特定文件
zip -r backup.zip /home --exclude "*.tmp" --exclude "*.log"

# 分卷压缩(每卷100MB)
zip -s 100m -r large_backup.zip /path/to/large/directory

# 修复损坏的zip文件
zip -F corrupted.zip --out fixed.zip

# 更新现有zip文件中的内容
zip -r existing.zip new_files/

7. compress/uncompress命令 - 老式压缩工具

7.1 compress命令基础

compressuncompress是较早的压缩工具,现在较少使用,但在某些传统系统上仍然可以看到。

基本语法:

compress [选项] [文件...]
uncompress [选项] [压缩文件...]

常用选项:

  • -c:将压缩数据输出到标准输出
  • -d:解压文件(等同于uncompress)
  • -f:强制压缩或解压
  • -v:显示压缩比
  • -b:设置压缩块大小(9-16)

7.2 compress压缩与解压操作

# 压缩文件(生成.z文件)
compress file.txt

# 解压文件
uncompress file.txt.Z

# 查看压缩文件内容
zcat file.txt.Z

8. 实战应用:常见场景解决方案

8.1 系统备份方案

全系统备份:

# 备份整个根目录,排除不需要的目录
tar -czvpPf /backup/full_system_$(date +%Y%m%d).tar.gz --exclude=/proc --exclude=/sys --exclude=/mnt --exclude=/media --exclude=/dev --exclude=/backup /

# 恢复系统(需要在单用户模式或从其他系统)
tar -xzvpPf /backup/full_system_20240713.tar.gz -C /

配置文件备份:

# 备份关键配置目录
tar -czvf /backup/config_backup_$(date +%Y%m%d).tar.gz /etc /var/spool/cron /home/*/.ssh

8.2 日志文件归档

# 压缩30天前的日志文件
find /var/log -name "*.log" -mtime +30 -exec gzip {} \;

# 将日志按日期打包
find /var/log -name "*.log" -mtime -7 | xargs tar -czvf /backup/logs_week_$(date +%Y%m%d).tar.gz

# 轮转日志并压缩
logrotate -f /etc/logrotate.conf

8.3 网站文件打包迁移

# 打包网站文件和数据库
tar -czvf /backup/website_$(date +%Y%m%d).tar.gz /var/www/html
mysqldump -u root -p database_name > /backup/db_backup_$(date +%Y%m%d).sql
tar -czvf /backup/full_website_backup_$(date +%Y%m%d).tar.gz /backup/website_*.tar.gz /backup/db_backup_*.sql

# 在目标服务器上恢复
scp user@source_server:/backup/full_website_backup_*.tar.gz /tmp/
tar -xzvf /tmp/full_website_backup_*.tar.gz -C /tmp
mysql -u root -p database_name < /tmp/db_backup_*.sql
tar -xzvf /tmp/website_*.tar.gz -C /var/www/html

8.4 源码打包与分发

# 打包源码,排除版本控制文件
tar -czvf project_1.0.tar.gz --exclude=".git" --exclude="node_modules" --exclude="*.log" /path/to/project

# 创建分发包(包含安装脚本)
cp /path/to/install.sh /path/to/project/
tar -czvf project_distribution.tar.gz /path/to/project

8.5 大文件分割与合并

# 分割文件(每个部分100MB)
split -b 100m large_file.tar.gz "large_file_part_"

# 合并分割的文件
cat large_file_part_* > merged_large_file.tar.gz

9. 性能优化与最佳实践

9.1 压缩算法选择

根据不同的需求选择合适的压缩算法:

  • 追求速度:gzip -1
  • 平衡速度和压缩率:gzip -6(默认)或zip -6
  • 追求高压缩率:bzip2 -9
  • 极致压缩率:xz -9 -T0(利用多线程)

9.2 并行压缩技术

对于大型数据集,可以使用并行压缩工具如pigz(并行gzip)和pbzip2(并行bzip2):

# 安装并行压缩工具
sudo apt-get install pigz pbzip2  # Debian/Ubuntu
sudo yum install pigz pbzip2      # CentOS/RHEL

# 使用pigz并行压缩
tar -cf - /path/to/large/directory | pigz -9 -p 8 > backup.tar.gz

# 使用pbzip2并行压缩
tar -cf - /path/to/large/directory | pbzip2 -9 -p 8 > backup.tar.bz2

9.3 存储空间优化策略

  • 定期归档:设置自动归档任务,压缩不常访问的文件
  • 增量备份:使用增量备份减少存储空间使用
  • 压缩率监控:监控不同文件类型的压缩率,选择最佳压缩方式
  • 压缩级别调整:对不同类型的文件使用不同的压缩级别

9.4 安全考虑

  • 加密敏感数据:使用zip -e或其他加密工具保护敏感信息
  • 校验和验证:创建文件校验和,确保数据完整性
# 创建文件校验和
md5sum backup.tar.gz > backup.tar.gz.md5sha256sum backup.tar.gz > backup.tar.gz.sha256

# 验证文件完整性
md5sum -c backup.tar.gz.md5
sha256sum -c backup.tar.gz.sha256

10. 总结与最佳实践

10.1 工具选择指南

需求 推荐工具 命令示例
快速备份 tar + gzip tar -czvf backup.tar.gz /path
高压缩率备份 tar + xz tar -cJvf backup.tar.xz /path
跨平台共享 zip zip -r share.zip /path
加密压缩 zip -e zip -er secure.zip /path
单文件压缩 gzip/bzip2/xz gzip file.txt
查看压缩文件内容 zcat/bzcat/xzcat zcat file.txt.gz

10.2 日常使用建议

  1. 养成备份习惯:定期使用tar等工具备份重要数据
  2. 选择合适的压缩级别:根据需要在速度和压缩率之间权衡
  3. 使用多线程压缩:处理大文件时利用多核CPU加速
  4. 保留校验信息:为重要备份创建校验和,确保数据完整性
  5. 文档化备份策略:记录备份内容、位置和恢复方法

11. 实用案例分析

11.1 案例:准备压缩文件的基本操作

以下是一个典型的准备压缩文件的案例,展示了如何在Linux中创建工作目录并复制文件以便后续压缩操作:

# 创建一个名为gzip的工作目录
mkdir gzip

# 进入该目录
cd gzip

# 复制系统文件到当前目录
cp /etc/fstab /etc/passwd .

# 查看当前目录内容
ll
# 输出:
# 总计 16
# drwxrwxr-x 2 soveran soveran 4096 11月 12 16:57 ./
# drwxrwxr-x 3 soveran soveran 4096 11月 12 16:56 ../
# -rw-r--r-- 1 soveran soveran  473 11月 12 16:57 fstab
# -rw-r--r-- 1 soveran soveran 2997 11月 12 16:57 passwd

# 复制issue文件(使用提示功能)
cp /etc/issue ./

# 再次查看目录内容
ll
# 输出:
# 总计 20
# drwxrwxr-x 2 soveran soveran 4096 11月 12 16:57 ./
# drwxrwxr-x 3 soveran soveran 4096 11月 12 16:56 ../
# -rw-r--r-- 1 soveran soveran  473 11月 12 16:57 fstab
# -rw-r--r-- 1 soveran soveran   26 11月 12 16:57 issue
# -rw-r--r-- 1 soveran soveran 2997 11月 12 16:57 passwd

11.2 cp命令中../的区别

11.3 案例:使用gzip保留原文件并显示压缩过程

以下案例展示了如何使用gzip命令在保留原文件的同时进行压缩,并显示压缩率信息:

# 使用gzip压缩文件,-k保留原文件,-v显示详细信息
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ gzip -vk fstab passwd
fstab:   30.9% -- created fstab.gz
passwd:  64.5% -- created passwd.gz

# 查看压缩后的文件列表
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ ll
总计 28
drwxrwxr-x 2 soveran soveran 4096 11月 12 17:24 ./
drwxrwxr-x 3 soveran soveran 4096 11月 12 16:56 ../
-rw-r--r-- 1 soveran soveran  473 11月 12 16:57 fstab
-rw-r--r-- 1 soveran soveran  351 11月 12 16:57 fstab.gz
-rw-r--r-- 1 soveran soveran   26 11月 12 16:57 issue
-rw-r--r-- 1 soveran soveran 2997 11月 12 16:57 passwd
-rw-r--r-- 1 soveran soveran 1089 11月 12 16:57 passwd.gz

案例分析

  • 使用-k选项保留了原始文件,同时创建了压缩后的.gz文件
  • 使用-v选项显示了详细的压缩信息,包括压缩率
  • 从输出可以看到:
    • fstab文件压缩率为30.9%,从473字节压缩到351字节
    • passwd文件压缩率为64.5%,从2997字节压缩到1089字节
  • 不同类型的文件压缩率不同,文本内容越多、冗余度越高的文件通常压缩率越好
  • 压缩后的文件和原文件同时存在于目录中,便于对比和备份

11.4 案例:gzip -c选项与重定向的使用

以下案例展示了gzip命令的-c选项(将输出写入标准输出而非删除原文件)与重定向结合使用的场景,以及相关注意事项:

# 查看原压缩文件信息
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ gzip -l fstab.gz 
          compressed        uncompressed  ratio uncompressed_name 
                 351                 473  30.9% fstab 

# 使用-c选项将issue文件压缩并输出重定向到fstab.gz(注意:这会覆盖原fstab.gz文件)
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ gzip issue -c >fstab.gz 

# 再次查看fstab.gz信息,发现内容已被替换为issue文件的压缩内容
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ gzip -l fstab.gz 
          compressed        uncompressed  ratio uncompressed_name 
                  52                  26  -7.7% fstab 

# 尝试解压缩时使用了错误的文件名(.zip扩展名)
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ gzip -d fstab.zip 
gzip: fstab.zip.gz: No such file or directory 

# 正确解压缩fstab.gz,系统提示是否覆盖已存在的fstab文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ gzip -d fstab.gz 
gzip: fstab already exists; do you wish to overwrite (y or n)? y 

# 重新压缩fstab并保留原文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ gzip fstab -c > fstab.gz 

# 创建空文件并尝试压缩
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ touch file1 
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ gzip file1 -c >issue.gz 

# 查看压缩后的空文件信息
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ gzip -l issue.gz 
          compressed        uncompressed  ratio uncompressed_name 
                  26                   0   0.0% issue 

案例分析

  1. 关于gzip -c选项
    • gzip -c将压缩输出写入标准输出,而不是默认的替换原文件
    • 使用重定向(>)时,会完全覆盖目标文件,不会追加到现有文件末尾
    • 这解释了为什么gzip issue -c >fstab.gz会导致fstab.gz的内容被完全替换
  2. 关于压缩率的特殊情况
    • 小文件可能出现负压缩率(如-7.7%),因为gzip头部信息增加了额外开销
    • 空文件压缩后仍有约26字节,用于存储压缩头和文件名信息
  3. 常见错误与解决
    • 解压缩时需要使用正确的文件名(包括扩展名),gzip会自动查找.gz扩展名
    • 当解压文件与现有文件同名时,gzip会提示是否覆盖
  4. 关于追加文件
    • gzip本身不支持直接追加文件到压缩归档中,这是与tar等归档工具的主要区别
    • 如果需要向压缩归档添加文件,正确的做法是:
      1. 解压现有归档
      2. 添加新文件
      3. 重新压缩整个目录
  5. 最佳实践
    • 对于需要管理多个文件的场景,建议先使用tar创建归档,再用gzip压缩
    • 使用-k选项保留原文件,避免意外数据丢失
    • 重要文件压缩前应备份,以防操作失误

11.5 案例:gzip的管道操作和自定义后缀名

以下案例展示了gzip命令通过管道接收输入并使用自定义后缀名的高级用法:

# 使用管道将passwd文件内容传递给gzip,并重定向输出到pwd.gz
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ cat passwd | gzip >pwd.gz 

# 查看创建的压缩文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ ll 
总计 36 
drwxrwxr-x 2 soveran soveran 4096 11月 12 17:40 ./ 
drwxrwxr-x 3 soveran soveran 4096 11月 12 16:56 ../ 
-rw-rw-r-- 1 soveran soveran    0 11月 12 17:35 file1 
-rw-r--r-- 1 soveran soveran   26 11月 12 17:32 fstab 
-rw-rw-r-- 1 soveran soveran   52 11月 12 17:34 fstab.gz 
-rw-r--r-- 1 soveran soveran   26 11月 12 16:57 issue 
-rw-rw-r-- 1 soveran soveran   26 11月 12 17:35 issue.gz 
-rw-r--r-- 1 soveran soveran 2997 11月 12 16:57 passwd 
-rw-r--r-- 1 soveran soveran 1089 11月 12 16:57 passwd.gz 
-rw-rw-r-- 1 soveran soveran 1082 11月 12 17:40 pwd.gz 

# 使用-S选项指定自定义后缀名.gzzz,同时使用-k保留原文件和-v显示详细信息
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ gzip -kv fstab -S .gzzz 
fstab:   -7.7% -- created fstab.gzzz 

# 查看创建的自定义后缀压缩文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ ll 
总计 40 
drwxrwxr-x 2 soveran soveran 4096 11月 12 17:40 ./ 
drwxrwxr-x 3 soveran soveran 4096 11月 12 16:56 ../ 
-rw-rw-r-- 1 soveran soveran    0 11月 12 17:35 file1 
-rw-r--r-- 1 soveran soveran   26 11月 12 17:32 fstab 
-rw-rw-r-- 1 soveran soveran   52 11月 12 17:34 fstab.gz 
-rw-r--r-- 1 soveran soveran   52 11月 12 17:32 fstab.gzzz 
-rw-r--r-- 1 soveran soveran   26 11月 12 16:57 issue 
-rw-rw-r-- 1 soveran soveran   26 11月 12 17:35 issue.gz 
-rw-r--r-- 1 soveran soveran 2997 11月 12 16:57 passwd 
-rw-r--r-- 1 soveran soveran 1089 11月 12 16:57 passwd.gz 
-rw-rw-r-- 1 soveran soveran 1082 11月 12 17:40 pwd.gz 

案例分析

  1. 通过管道使用gzip
    • cat passwd | gzip >pwd.gz 演示了如何使用管道将文件内容传递给gzip命令
    • 这种方式相当于使用了gzip -c passwd >pwd.gz,但更加灵活,适用于复杂的数据处理流程
    • 可以将gzip集成到shell管道中,实现数据的流式处理和压缩
  2. 自定义后缀名功能
    • -S .gzzz 选项允许指定自定义的文件后缀,而不是默认的.gz
    • 这在需要区分不同类型的压缩文件或满足特定命名规范时非常有用
    • 创建了fstab.gzzz文件,虽然后缀不同,但内部仍然是标准的gzip压缩格式
  3. 多选项组合使用
    • -kv 选项组合展示了如何同时使用多个功能选项
    • -k 保留原文件,-v 显示压缩过程的详细信息
    • 即使使用自定义后缀,压缩率和详细信息仍然会正确显示
  4. 关于小文件的压缩效果
    • 对于fstab这样的小文件(仅26字节),压缩后反而增大(52字节),显示负压缩率(-7.7%)
    • 这是因为gzip头部信息的开销大于压缩带来的收益
    • 在实际应用中,对于非常小的文件,可能不需要压缩
  5. 实用技巧
    • 管道方式适合处理从其他命令生成的输出或需要预处理的数据
    • 自定义后缀可以用于区分不同来源或用途的压缩文件
    • 当需要批量处理具有不同命名规范的文件时,自定义后缀功能特别有用

11.6 案例:gzip递归压缩目录

以下案例展示了gzip命令递归压缩目录中文件的用法,以及-r选项的必要性:

# 创建目录结构和测试文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ mkdir dir1/dir{a..c} -p 
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ echo a > dir1/dira/a.txt 
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ echo b > dir1/dirb/b.txt 
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ echo c > dir1/dirc/c.txt 

# 尝试直接压缩目录(不使用-r选项)
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ gzip -vk dir1/ 
gzip: dir1/ is a directory -- ignored 

# 查看目录结构\soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ tree dir1 
dir1 
├── dira 
│\u00a0\u00a0└── a.txt 
├── dirb 
│\u00a0\u00a0└── b.txt 
└── dirc 
    └── c.txt 

4 directories, 3 files 

# 使用-r选项递归压缩目录中的所有文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ gzip -vrk dir1/ 
dir1/dirb/b.txt:        -100.0% -- created dir1/dirb/b.txt.gz 
dir1/dira/a.txt:        -100.0% -- created dir1/dira/a.txt.gz 
dir1/dirc/c.txt:        -100.0% -- created dir1/dirc/c.txt.gz 

# 查看压缩后的目录结构
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ tree dir1 
dir1 
├── dira 
│\u00a0\u00a0├── a.txt 
│\u00a0\u00a0└── a.txt.gz 
├── dirb 
│\u00a0\u00a0├── b.txt 
│\u00a0\u00a0└── b.txt.gz 
└── dirc 
    ├── c.txt 
    └── c.txt.gz 

4 directories, 6 files 

案例分析

  1. gzip不直接处理目录
    • gzip是一个文件压缩工具,默认情况下不能直接压缩目录
    • 当尝试直接对目录使用gzip时,会收到错误提示:gzip: dir1/ is a directory -- ignored
    • 这与tar等归档工具不同,gzip专注于单个文件的压缩
  2. 递归压缩选项-r
    • 使用-r(recursive)选项可以让gzip递归地处理目录中的所有文件
    • gzip -vrk dir1/命令会遍历dir1目录及其所有子目录中的文件
    • 对每个找到的文件单独进行压缩处理
  3. 保留原文件选项-k
    • 结合-k选项,递归压缩时会保留原始文件
    • 从结果可以看到,每个txt文件都生成了对应的gz压缩文件,同时原始文件仍然存在
    • 这对于需要同时保留原始数据和压缩版本的场景非常有用
  4. 关于压缩率的特殊情况
    • 对于这些极小的测试文件(仅包含一个字符),显示了负压缩率(-100.0%)
    • 这再次证明了对于非常小的文件,gzip头部信息的开销会导致压缩后文件反而变大
    • 在实际应用中,应该考虑文件大小和压缩收益的平衡
  5. 实用建议
    • 当需要压缩目录时,gzip需要与-r选项配合使用
    • 对于目录压缩的常见场景,通常更推荐使用tar -czf组合命令
    • 只有当确实需要单独压缩目录中的每个文件,而不是创建单一归档文件时,才使用gzip的递归压缩功能
    • 压缩前应评估文件大小,对于非常小的文件考虑是否有必要压缩

11.7 案例:查看压缩文件信息

以下案例展示了使用gzip -l命令查看单个或多个压缩文件详细信息的功能:

# 查看单个压缩文件的信息
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ gzip -l fstab.gz 
         compressed        uncompressed  ratio uncompressed_name 
                 52                  26  -7.7% fstab 

# 同时查看多个压缩文件的信息,并显示总计
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ gzip -l fstab.gz passwd.gz 
         compressed        uncompressed  ratio uncompressed_name 
                 52                  26  -7.7% fstab 
               1089                2997  64.5% passwd 
               1141                3023  63.1% (totals) 

案例分析

  1. 查看压缩统计信息
    • -l选项(list)用于列出压缩文件的详细统计信息
    • 输出包含四列数据:压缩后大小、原始大小、压缩率和原始文件名
    • 这些信息对于了解压缩效果和文件大小变化非常有用
  2. 单个文件分析
    • 对于极小的fstab文件,显示了负压缩率(-7.7%)
    • 这是因为文件内容很小(26字节),而gzip头部信息占用了额外空间
    • 压缩后大小(52字节)反而比原始大小大,证实了小文件可能不适合压缩的原则
  3. 多文件组合分析
    • 当同时查看多个文件时,gzip -l会为每个文件显示单独的统计
    • 最后一行显示所有文件的总计信息(压缩后总计、原始总计、总压缩率)
    • 对于较大的passwd文件,显示了良好的压缩效果(64.5%的压缩率)
  4. 压缩率计算方法
    • 正压缩率表示文件变小(例如64.5%表示比原始文件小64.5%)
    • 负压缩率表示文件变大(例如-7.7%表示比原始文件大7.7%)
    • 计算方式:(原始大小-压缩后大小)/原始大小×100%
  5. 实用建议
    • 在批量压缩文件前,可使用gzip -l预估压缩效果
    • 对于整体压缩率计算,同时列出多个文件可以获得更准确的总计信息
    • 对于小文件比例较高的场景,可考虑是否有必要压缩以避免存储空间反而增加的情况
    • 在备份或归档前,了解压缩率有助于预估所需存储空间

11.8 案例:使用gunzip解压缩文件

以下案例展示了使用gunzip命令解压缩文件的用法,以及多个选项的组合使用:

# 删除原始文件,准备测试解压缩
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ rm -rf fstab passwd 

# 查看当前目录中的压缩文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ ll 
总计 36 
drwxrwxr-x 3 soveran soveran 4096 11月 12 18:02 ./ 
drwxrwxr-x 3 soveran soveran 4096 11月 12 16:56 ../ 
drwxrwxr-x 5 soveran soveran 4096 11月 12 17:45 dir1/ 
-rw-rw-r-- 1 soveran soveran    0 11月 12 17:35 file1 
-rw-rw-r-- 1 soveran soveran   52 11月 12 17:34 fstab.gz 
-rw-r--r-- 1 soveran soveran   52 11月 12 17:32 fstab.gzzz 
-rw-r--r-- 1 soveran soveran   26 11月 12 16:57 issue 
-rw-rw-r-- 1 soveran soveran   26 11月 12 17:35 issue.gz 
-rw-r--r-- 1 soveran soveran 1089 11月 12 16:57 passwd.gz 
-rw-rw-r-- 1 soveran soveran 1082 11月 12 17:40 pwd.gz 

# 使用gunzip同时解压缩多个文件,保留压缩文件,显示详细信息,强制覆盖同名文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ gunzip -vkf fstab.gz passwd.gz 
fstab.gz:        -7.7% -- created fstab 
passwd.gz:       64.5% -- created passwd 

# 查看解压缩后的文件列表
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/blank/gzip $ ll 
总计 44 
drwxrwxr-x 3 soveran soveran 4096 11月 12 18:03 ./ 
drwxrwxr-x 3 soveran soveran 4096 11月 12 16:56 ../ 
drwxrwxr-x 5 soveran soveran 4096 11月 12 17:45 dir1/ 
-rw-rw-r-- 1 soveran soveran    0 11月 12 17:35 file1 
-rw-rw-r-- 1 soveran soveran   26 11月 12 17:34 fstab 
-rw-rw-r-- 1 soveran soveran   52 11月 12 17:34 fstab.gz 
-rw-r--r-- 1 soveran soveran   52 11月 12 17:32 fstab.gzzz 
-rw-r--r-- 1 soveran soveran   26 11月 12 16:57 issue 
-rw-rw-r-- 1 soveran soveran   26 11月 12 17:35 issue.gz 
-rw-r--r-- 1 soveran soveran 2997 11月 12 16:57 passwd 
-rw-r--r-- 1 soveran soveran 1089 11月 12 16:57 passwd.gz 
-rw-rw-r-- 1 soveran soveran 1082 11月 12 17:40 pwd.gz 

案例分析

  1. gunzip命令与gzip的关系
    • gunzipgzip命令的解压缩模式,功能与gzip -d等价
    • 主要用于解压缩.gz格式的文件
    • 可以同时处理多个压缩文件
  2. 选项组合使用
    • -v(verbose):显示详细的解压缩过程和压缩率信息
    • -k(keep):保留原始压缩文件,默认情况下gunzip会删除压缩文件
    • -f(force):强制解压缩,即使目标文件已存在也会覆盖
    • 这些选项可以组合使用,提供更灵活的解压缩控制
  3. 多文件同时处理
    • gunzip支持一次解压缩多个文件,只需在命令后列出所有要解压缩的文件
    • 每个文件都会单独处理,并显示各自的解压缩信息
    • 这对于批量解压缩操作非常高效
  4. 压缩率显示
    • 解压缩过程中显示的压缩率与压缩时相同
    • 对于fstab文件显示负压缩率(-7.7%),表示压缩后反而变大
    • 对于passwd文件显示正压缩率(64.5%),表示压缩效果良好
  5. 文件保留机制
    • 由于使用了-k选项,解压缩后原始的.gz文件仍然保留
    • 这在需要同时保留原始压缩文件和解压缩文件的场景下非常有用
    • 从目录列表可以看到,fstab.gz和passwd.gz文件依然存在,同时新增了解压缩后的文件
  6. 实用建议
    • 在脚本中使用时,建议添加-f选项以避免因文件已存在而导致的解压缩失败
    • 对于重要数据,使用-k选项保留原始压缩文件作为备份
    • 批量处理多个文件时,一次性列出所有文件可以提高效率
    • 使用-v选项在调试或监控场景中获取更多反馈信息

12. tar命令的使用与案例分析

在Linux系统中,tar命令是最常用的归档工具之一,可以将多个文件和目录打包成一个归档文件。下面我们将通过一系列实用案例来详细介绍tar命令的使用方法。

12.1 案例:查看tar命令的默认选项

以下案例展示了如何查看tar命令的默认配置选项:

# 创建并进入测试目录
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic $ mkdir tar; cd tar 

# 查看tar命令以--show开头的选项
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar --show-
--show-defaults               --show-omitted-dirs           --show-snapshot-field-ranges  --show-stored-names           --show-transformed-names 

# 再次查看以--show开头的选项
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar --show-
--show-defaults               --show-omitted-dirs           --show-snapshot-field-ranges  --show-stored-names           --show-transformed-names 

# 查看tar命令的默认选项配置
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar --show-defaults 
--format=gnu -f- -b20 --quoting-style=escape --rmt-command=/usr/sbin/rmt --rsh-command=/usr/bin/rsh 

案例分析

  1. 命令选项探索
    • 通过输入tar --show-并按Tab键,可以查看tar命令所有以--show-开头的选项
    • 这种方法对于发现命令的可用选项非常有用,特别是在不记得完整选项名称时
  2. --show-defaults选项功能
    • --show-defaults选项用于显示tar命令的默认配置选项
    • 这些默认值是在不指定任何选项时tar命令会使用的设置
    • 输出结果包含了多个默认配置参数
  3. 默认配置详解
    • --format=gnu:默认使用GNU格式创建归档文件,这是GNU tar的默认格式
    • -f-:默认输出到标准输出(stdout),而不是写入文件
    • -b20:默认使用20个块,每个块512字节,这是历史上的标准块大小
    • --quoting-style=escape:使用转义风格处理文件名中的特殊字符
    • --rmt-command=/usr/sbin/rmt:指定远程磁带机命令的路径
    • --rsh-command=/usr/bin/rsh:指定远程shell命令的路径
  4. 实用价值
    • 了解默认选项有助于更好地理解tar命令的行为
    • 在编写脚本或创建自定义归档操作时,可以明确知道默认设置
    • 当需要修改默认行为时,可以针对性地使用相应选项覆盖默认值
  5. 扩展使用场景
    • 在不同系统之间迁移数据时,了解默认格式可以确保兼容性
    • 在性能调优时,可以根据需要调整块大小(-b选项)
    • 对于远程操作,了解默认的远程命令配置很重要

12.2 案例:创建归档文件并查看内容

以下案例展示了如何使用tar命令创建归档文件并查看其内容:

# 创建/etc目录的归档文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ sudo tar -cf etc.tar /etc 
tar: 从成员名中删除开头的“/”

# 查看当前目录文件列表
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ ll
总计 7848
drwxrwxr-x 2 soveran soveran    4096 11月 12 18:20 ./
drwxrwxr-x 6 soveran soveran    4096 11月 12 18:15 ../
-rw-rw-r-- 1 soveran soveran 8028160 11月 12 18:20 etc.tar

# 尝试错误的方式查看归档内容
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar -t etc.tar
tar: 无法从终端读取归档内容(缺少 -f 选项?)
tar: Error is not recoverable: exiting now

# 正确查看归档内容
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar -tf etc.tar
etc/
etc/opt/
etc/mke2fs.conf
etc/wpa_supplicant/
etc/wpa_supplicant/functions.sh
etc/wpa_supplicant/ifupdown.sh
etc/wpa_supplicant/action_wpa.sh
etc/vconsole.conf
etc/magic.mime
etc/newt/
etc/newt/palette.ubuntu
etc/newt/palette.original
etc/newt/palette
etc/fprintd.conf
etc/avahi/
etc/avahi/services/
etc/avahi/avahi-daemon.conf
etc/avahi/hosts
etc/alsa/
etc/alsa/conf.d/
etc/alsa/conf.d/99-pipewire-default.conf
etc/alsa/conf.d/50-pipewire.conf
...

案例分析

  1. 创建归档操作
    • sudo tar -cf etc.tar /etc 命令创建了一个名为etc.tar的归档文件,包含/etc目录的所有内容
    • -c选项表示创建新的归档文件
    • -f etc.tar选项指定归档文件名为etc.tar
    • 需要sudo权限是因为/etc目录包含需要特权才能访问的文件
  2. 路径处理特性
    • 注意到警告消息”tar: 从成员名中删除开头的’/’“,这是tar的一个安全特性
    • 这个特性防止在提取归档时覆盖绝对路径上的文件,提高了安全性
    • 结果归档中的路径变为相对路径”etc/”而不是绝对路径”/etc/”
  3. 文件大小
    • 生成的etc.tar文件大小约为7.7MB,这是/etc目录的原始大小经过打包后的结果
    • 注意tar只是打包不压缩,所以文件大小与原始数据量相关
  4. 查看归档内容
    • 尝试使用tar -t etc.tar失败,错误提示”无法从终端读取归档内容(缺少 -f 选项?)”
    • 正确的命令应该是tar -tf etc.tar,其中-t选项用于列出归档内容,-f etc.tar指定要操作的归档文件
    • 当使用tar命令时,必须使用-f选项明确指定归档文件
  5. 输出内容
    • tar -tf etc.tar成功显示了归档中的文件和目录列表
    • 输出保留了原始的目录结构,按字母顺序排列
    • 输出内容较长时会自动截断显示(…),可以通过管道配合less等工具查看完整内容
  6. 常见错误与解决方案
    • 忘记使用-f选项是tar命令最常见的错误之一
    • 当处理系统目录时,需要确保有足够的权限访问所有文件
    • 对于大型归档,可以使用tar -tf etc.tar | less来分页查看内容

12.3 案例:使用-P选项保留绝对路径

以下案例展示了如何使用tar命令的-P选项来保留绝对路径:

# 使用-P选项创建/etc目录的归档文件(保留绝对路径)
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ sudo tar -cPf etc2.tar /etc 
[sudo] soveran 的密码:

# 查看当前目录文件列表
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ ll
总计 15688
drwxrwxr-x 2 soveran soveran    4096 11月 12 19:25 ./
drwxrwxr-x 6 soveran soveran    4096 11月 12 18:15 ../
-rw-rw-r-- 1 soveran soveran 8028160 11月 12 19:25 etc2.tar
-rw-rw-r-- 1 soveran soveran 8028160 11月 12 18:20 etc.tar

# 查看使用-P选项创建的归档内容
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar -tf etc2.tar
tar: 从成员名中删除开头的"/"
/etc/
/etc/opt/
/etc/mke2fs.conf
/etc/wpa_supplicant/
/etc/wpa_supplicant/functions.sh
/etc/wpa_supplicant/ifupdown.sh
/etc/wpa_supplicant/action_wpa.sh
/etc/vconsole.conf
/etc/magic.mime
/etc/newt/
/etc/newt/palette.ubuntu
/etc/newt/palette.original
/etc/newt/palette
/etc/fprintd.conf
/etc/avahi/
/etc/avahi/services/
/etc/avahi/avahi-daemon.conf
/etc/avahi/hosts
/etc/alsa/
/etc/alsa/conf.d/
/etc/alsa/conf.d/99-pipewire-default.conf

案例分析

  1. -P选项功能
    • -P(或--absolute-names)选项用于在创建归档时保留绝对路径
    • 与默认行为(删除开头的/)相反,此选项会保留完整的绝对路径信息
    • 注意到即使使用了-P选项,在查看内容时仍然会显示警告消息”tar: 从成员名中删除开头的’/’”
    • 但实际输出的路径确实以/开头,表明路径信息被正确保留了
  2. 对比分析
    • 不使用-P选项时,路径显示为:etc/(相对路径)
    • 使用-P选项时,路径显示为:/etc/(绝对路径)
    • 两个归档文件的大小相同(8028160字节),因为-P选项只影响路径存储,不影响数据压缩
  3. 权限要求
    • 处理系统目录(如/etc)时需要使用sudo获取管理员权限
    • 输入密码是正常的安全验证过程
  4. 安全考虑
    • 保留绝对路径在某些情况下很有用,例如系统备份和恢复
    • 但需要注意,提取包含绝对路径的归档可能会覆盖系统文件,存在安全风险
    • 在生产环境中应谨慎使用-P选项,特别是当归档内容来自不受信任的来源时
  5. 使用场景
    • 系统备份:保留原始路径结构便于完整恢复
    • 配置迁移:确保配置文件恢复到正确的系统位置
    • 开发环境重建:需要精确还原文件系统结构的场景
  6. 实用建议
    • 对于普通的文件备份,通常不建议使用-P选项,相对路径更安全
    • 在使用-P选项提取归档时,考虑使用--strip-components选项来调整目标路径
    • 结合-v选项可以在创建或提取时查看详细的路径信息

在上述案例中,我们看到了两种不同的目标路径表示方式:

  1. . 表示当前目录
    • cp /etc/fstab /etc/passwd . 中,. 作为目标路径,表示将文件复制到当前工作目录
    • 这是Linux中表示当前目录的标准简写形式
    • 在大多数情况下,. 足以指示当前目录
  2. ./ 也表示当前目录
    • cp /etc/issue ./ 中,./ 同样表示当前工作目录
    • ./ 明确指定了相对于当前目录的路径

主要区别和使用场景

  • 功能等价性:从功能上讲,../ 在大多数情况下效果相同,都表示当前目录
  • 可读性差异./ 在某些情况下可能更清晰,特别是当目录名后面需要附加其他路径时
  • 特殊情况
    • 使用通配符时./ 可以避免与命令行参数混淆
      # 假设当前目录有文件 -f.txt 和其他 .txt 文件
      # 错误示例:rm -f.txt 会被解释为 rm 的 -f 参数和 txt 文件
      rm -f.txt  # 可能报错或不正确的行为
          
      # 正确示例:使用 ./ 明确指示是文件名
      rm ./-f.txt  # 正确删除 -f.txt 文件
      
    • 执行脚本或命令时./ 可以确保命令引用的是当前目录中的文件,而不是PATH环境变量中的命令
      # 假设当前目录有一个名为 ls 的脚本文件
      # 直接执行 ls 会运行系统的 ls 命令
      ls  # 执行系统 ls 命令
          
      # 使用 ./ 执行当前目录的脚本
      ./ls  # 执行当前目录的 ls 脚本文件
      
    • 重命名复制时:当目标文件名与源文件名不同时,./newfilename 语法更清晰 ```bash

      复制并重命名文件

      cp source.txt ./destination.txt # 清晰地表示复制到当前目录并重命名

      不使用 ./ 的写法

      cp source.txt . # 复制到当前目录,保留原文件名 cp source.txt destination.txt # 复制并重命名,但不清楚是否在当前目录

最佳实践

  • 在简单的文件复制操作中,使用 . 通常足够
  • 在脚本编写或需要明确路径时,使用 ./ 可以增加代码的可读性和避免潜在的混淆

12.8 案例:向现有归档添加文件

以下案例展示了如何向已有的tar归档文件中添加新文件:

# 创建新文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ echo f3 > f3.txt 

# 复制系统文件到当前目录
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ cp /etc/fstab /etc/passwd  ./ 

# 查看当前目录文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ ls 
f1.txt  f2.txt  f3.txt  fstab  passwd  test.tar 

# 查看现有归档内容
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar tvf test.tar 
drwxrwxr-x soveran/soveran   0 2025-11-12 20:06 ./ 
-rw-rw-r-- soveran/soveran   3 2025-11-12 19:42 ./f1.txt 
-rw-rw-r-- soveran/soveran   3 2025-11-12 19:42 ./f2.txt 

# 向现有归档添加新文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar -rf test.tar f3.txt passwd 

# 验证文件已添加到归档
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar -tvf test.tar 
drwxrwxr-x soveran/soveran   0 2025-11-12 20:06 ./ 
-rw-rw-r-- soveran/soveran   3 2025-11-12 19:42 ./f1.txt 
-rw-rw-r-- soveran/soveran   3 2025-11-12 19:42 ./f2.txt 
-rw-rw-r-- soveran/soveran   3 2025-11-12 20:07 f3.txt 
-rw-r--r-- soveran/soveran 2997 2025-11-12 20:08 passwd 

案例分析

  1. 追加模式操作
    • 使用-r(或--append)选项可以向现有的tar归档中添加新文件
    • 这是tar命令的一个重要特性,允许在不重新创建整个归档的情况下更新内容
    • 追加操作比重新创建整个归档更高效,特别是对于大型归档文件
  2. 命令参数分析
    • tar -rf test.tar f3.txt passwd命令的结构:
      • -r:追加模式标志
      • -f test.tar:指定目标归档文件名
      • f3.txt passwd:要添加的文件列表(可以指定多个文件)
  3. 路径处理差异
    • 注意观察到一个重要的路径差异:
      • 原有文件f1.txtf2.txt在归档中显示为./f1.txt./f2.txt(带有相对路径前缀)
      • 新添加的文件f3.txtpasswd在归档中显示为f3.txtpasswd(没有路径前缀)
    • 这种差异是由于添加文件时使用的路径格式不同导致的
    • 当创建归档时使用./指定当前目录,而追加时直接指定文件名,会导致路径表示不一致
  4. 文件权限保留
    • 注意到系统文件passwd保留了其原始权限(-rw-r--r--
    • 这表明tar命令在追加文件时也会保留文件的权限信息
  5. 使用场景
    • 持续更新的备份:随着新文件的创建,可以不断添加到现有的备份归档中
    • 项目文件管理:在开发过程中,可以将新创建的文件添加到项目归档中
    • 分批处理大型数据集:可以先创建基础归档,然后逐步添加其他文件
  6. 注意事项
    • 追加操作只适用于未压缩的tar归档文件(.tar
    • 如果归档已经被压缩(如.tar.gz.tar.bz2等),则不能直接追加内容
    • 为了保持归档中路径的一致性,建议使用与创建归档时相同的路径格式来追加文件
    • 使用-v选项(如tar -rvf)可以在追加文件时查看详细信息
  7. 最佳实践
    • 在创建归档时就考虑未来可能的追加需求,选择合适的路径格式
    • 对于大型归档,定期验证归档完整性,确保追加操作没有损坏文件
    • 考虑使用版本控制或时间戳命名归档文件,以便区分不同时期的备份

12.9 案例:从归档中删除文件

以下案例展示了如何从tar归档中删除文件,以及路径匹配的重要性:

# 尝试使用错误路径格式删除文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar --delete -vf test.tar f1.txt f2.txt 
tar: f1.txt:归档中找不到 
tar: f2.txt:归档中找不到 
tar: 由于前次错误,将以上次的错误状态退出 

# 使用正确的路径格式删除文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar --delete -vf test.tar ./f1.txt ./f2.txt 

# 验证文件已被删除
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar -tvf test.tar 
drwxrwxr-x soveran/soveran   0 2025-11-12 20:06 ./ 
-rw-rw-r-- soveran/soveran   3 2025-11-12 20:07 f3.txt 
-rw-r--r-- soveran/soveran 2997 2025-11-12 20:08 passwd 

# 删除当前目录项
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar --delete -vf test.tar ./ 

# 验证当前目录项已被删除
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar -tvf test.tar 
-rw-rw-r-- soveran/soveran   3 2025-11-12 20:07 f3.txt 
-rw-r--r-- soveran/soveran 2997 2025-11-12 20:08 passwd 

# 重新添加之前删除的文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar -rf test.tar f1.txt f2.txt 

# 验证文件已重新添加(注意路径格式已改变)
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar -tvf test.tar 
-rw-rw-r-- soveran/soveran   3 2025-11-12 20:07 f3.txt 
-rw-r--r-- soveran/soveran 2997 2025-11-12 20:08 passwd 
-rw-rw-r-- soveran/soveran    3 2025-11-12 19:42 f1.txt 
-rw-rw-r-- soveran/soveran    3 2025-11-12 19:42 f2.txt 

案例分析

  1. 路径匹配的重要性
    • 第一个删除命令失败,因为使用了错误的路径格式(f1.txt
    • 第二个删除命令成功,因为使用了正确的路径格式(./f1.txt
    • 这明确展示了tar在处理归档内容时路径匹配的严格性
    • 归档中的文件路径必须与删除命令中指定的路径完全匹配
  2. 删除命令参数
    • --delete选项用于从归档中删除文件
    • 命令格式:tar --delete -vf 归档文件名 要删除的文件路径1 要删除的文件路径2 ...
    • -v选项(详细模式)在删除操作中会显示哪些文件被处理
  3. 目录项删除
    • 案例展示了可以删除归档中的目录项(./
    • 删除目录项并不会删除其中的文件内容
    • 这允许在保持文件内容的同时调整归档的目录结构
  4. 路径格式转换
    • 观察到一个重要的路径转换:
      • 原始归档中的文件路径是./f1.txt./f2.txt(带有./前缀)
      • 重新添加后,文件路径变为f1.txtf2.txt(没有前缀)
    • 这表明tar允许在更新归档时改变文件的路径表示形式
  5. 操作连续性
    • 案例展示了完整的归档管理流程:删除文件 → 验证删除 → 删除目录项 → 重新添加文件
    • 这说明了tar命令的灵活性,可以对归档内容进行精细管理
  6. 注意事项
    • --delete选项只适用于未压缩的tar归档文件(.tar
    • 如果归档已经被压缩(如.tar.gz.tar.bz2等),则不能直接删除内容
    • 删除操作是不可逆的,建议在删除前备份重要的归档文件
    • 删除操作会修改归档文件本身,而不是创建新的归档
  7. 错误处理
    • 当指定的文件在归档中找不到时,tar会显示错误消息
    • 如果一个文件删除失败,tar会退出并返回错误状态码
    • 使用详细模式(-v)可以更好地监控删除操作的进展
  8. 最佳实践
    • 在执行删除操作前,始终使用tar -tvf验证归档中的文件路径
    • 对于重要的归档,在修改前创建备份
    • 考虑使用脚本自动化复杂的归档管理任务,确保路径格式的一致性
    • 对于频繁更新的归档,定期重建整个归档以优化性能和结构

12.10 案例:合并归档文件

以下案例展示了如何使用tar命令的-A选项将一个归档文件合并到另一个归档文件中:

# 将test.tar归档合并到test2.tar中
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar -A test.tar -f test2.tar 

# 验证合并结果
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar -tvf test2.tar 
-rw-rw-r-- soveran/soveran   3 2025-11-12 20:07 f3.txt 
-rw-r--r-- soveran/soveran 2997 2025-11-12 20:08 passwd 
-rw-rw-r-- soveran/soveran    3 2025-11-12 19:42 f1.txt 
-rw-rw-r-- soveran/soveran    3 2025-11-12 19:42 f2.txt 

案例分析

  1. 合并命令参数
    • -A(或--catenate)选项用于将一个tar归档文件合并到另一个归档文件中
    • 命令格式:tar -A 源归档文件 -f 目标归档文件
    • 在示例中,test.tar是源归档,test2.tar是目标归档
  2. 合并操作原理
    • 合并操作会将源归档文件(test.tar)的内容追加到目标归档文件(test2.tar)的末尾
    • 目标归档文件必须已经存在,而源归档文件的内容将被添加到其中
    • 从输出结果可以看到,test2.tar现在包含了f3.txt、passwd、f1.txt和f2.txt四个文件
  3. 权限保留特性
    • 合并操作会保留原始文件的所有属性,包括权限、所有者、修改时间等
    • 从输出中可以看到,每个文件都保留了原始的权限信息(如-rw-rw-r--)和所有者信息(如soveran/soveran
  4. 文件顺序
    • 合并后的归档文件中,原始目标归档的内容会先显示,然后是源归档的内容
    • 这表明tar命令按照指定的顺序处理归档文件
  5. 注意事项
    • -A选项只适用于未压缩的tar归档文件(.tar
    • 如果归档已经被压缩(如.tar.gz.tar.bz2等),则不能直接合并
    • 合并操作会修改目标归档文件本身,而不是创建新的归档文件
    • 如果目标归档文件不存在,tar命令会报错
  6. 使用场景
    • 当需要将多个归档文件合并为一个统一的归档时非常有用
    • 可以用于增量备份的整合,将多个增量备份归档合并为一个完整备份
    • 适用于归档文件的整理和重组,便于管理大量分散的归档文件
  7. 最佳实践
    • 在执行合并操作前,建议使用tar -tvf查看源归档和目标归档的内容,确保合并后的结构符合预期
    • 对于重要的归档文件,在合并前创建备份,以防止意外数据丢失
    • 考虑归档文件的大小,合并大型归档文件可能需要较长时间和足够的磁盘空间
    • 合并操作完成后,验证目标归档文件的内容,确保所有文件都被正确合并

12.11 案例:提取归档文件到指定目录

以下案例展示了如何使用tar命令的-C选项将归档文件内容提取到指定目录:

# 清理当前目录中的f开头文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ rm -rf f*

# 查看当前目录内容
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ ll
总计 44
drwxrwxr-x 2 soveran soveran  4096 11月 12 20:18 ./
drwxrwxr-x 6 soveran soveran  4096 11月 12 18:15 ../
-rw-r--r-- 1 soveran soveran  2997 11月 12 20:08 passwd
-rw-rw-r-- 1 soveran soveran 20480 11月 12 20:17 test2.tar
-rw-rw-r-- 1 soveran soveran 10240 11月 12 20:13 test.tar

# 提取归档文件到当前目录
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar xf test.tar

# 验证提取结果
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ ll
总计 56
drwxrwxr-x 2 soveran soveran  4096 11月 12 20:18 ./
drwxrwxr-x 6 soveran soveran  4096 11月 12 18:15 ../
-rw-rw-r-- 1 soveran soveran     3 11月 12 19:42 f1.txt
-rw-rw-r-- 1 soveran soveran     3 11月 12 19:42 f2.txt
-rw-rw-r-- 1 soveran soveran     3 11月 12 20:07 f3.txt
-rw-r--r-- 1 soveran soveran  2997 11月 12 20:08 passwd
-rw-rw-r-- 1 soveran soveran 20480 11月 12 20:17 test2.tar
-rw-rw-r-- 1 soveran soveran 10240 11月 12 20:13 test.tar

# 创建临时目录
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ mkdir temp

# 提取归档文件到指定目录
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar xf test.tar -C temp/

# 验证指定目录中的提取结果
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ ls temp/
f1.txt  f2.txt  f3.txt  passwd

案例分析

  1. 提取命令参数
    • -x(或--extract)选项用于从归档文件中提取内容
    • -f选项指定归档文件
    • -C选项允许指定提取内容的目标目录
    • 命令格式:tar xf 归档文件名 -C 目标目录
  2. 默认提取行为
    • 不使用-C选项时,tar会将文件提取到当前工作目录
    • 从示例中可以看到,第一次提取后,f1.txt、f2.txt、f3.txt和passwd文件都出现在当前目录中
  3. 指定目录提取
    • 使用-C temp/选项后,tar将所有内容提取到temp目录中
    • 验证命令ls temp/确认所有文件都正确提取到了指定目录
  4. 目录创建要求
    • 使用-C选项前,目标目录必须已经存在
    • 案例中先创建了temp目录,然后才使用-C temp/选项
    • 如果目标目录不存在,tar命令会报错
  5. 路径处理
    • 当使用-C选项时,tar会先切换到指定目录,然后在该目录中创建归档中的文件结构
    • 这意味着归档中的相对路径会基于指定的目标目录而不是当前工作目录
  6. 文件权限保留
    • 无论是否使用-C选项,tar提取文件时都会保留原始的文件权限和属性
    • 这确保了提取的文件与归档中的文件具有相同的安全设置
  7. 注意事项
    • 使用-C选项可以避免将归档内容散布在当前目录中,有助于保持目录结构整洁
    • 对于包含复杂目录结构的归档,使用-C选项可以确保正确重建整个目录树
    • 可以与其他选项组合使用,如-v(详细模式)查看提取过程
  8. 使用场景
    • 当需要将归档内容提取到特定位置进行处理时非常有用
    • 适用于在不影响当前工作目录的情况下查看归档内容
    • 便于在临时目录中提取和检查归档内容,避免文件冲突
    • 在自动化脚本中,可以精确控制文件的提取位置

12.12 案例:不同压缩格式的比较与使用

以下案例展示了如何使用tar命令创建不同压缩格式的归档文件,并比较它们的压缩效率:

# 尝试创建bzip2压缩的归档文件(首次失败)
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ sudo tar cjf etc.tar.xz /etc/
 tar: 从成员名中删除开头的"/"
 /bin/sh: 1: bzip2: not found
 tar: etc.tar.xz: Wrote only 4096 of 10240 bytes
 tar: Child returned status 127
 tar: Error is not recoverable: exiting now

# 安装bzip2压缩工具
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ sudo apt install bzip2
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成
...
正在设置 bzip2 (1.0.8-5.1build0.1) ...

# 安装后成功创建xz压缩的归档文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ sudo tar cjf etc.tar.xz /etc/
 tar: 从成员名中删除开头的"/"

# 验证创建的文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ ll
总计 2504
drwxrwxr-x 3 soveran soveran    4096 11月 12 20:24 ./
drwxrwxr-x 6 soveran soveran    4096 11月 12 18:15 ../
-rw-rw-r-- 1 soveran soveran 1341774 11月 12 20:24 etc.tar.gz
-rw-r--r-- 1 root    root    1156561 11月 12 20:25 etc.tar.xz
...

# 使用专门的xz压缩选项重新创建归档
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ sudo tar cJf etc.tar.xz /etc/
 tar: 从成员名中删除开头的"/"

# 验证重新创建的xz压缩文件(大小更小)
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ ll
总计 2328
...
-rw-r--r-- 1 root    root     976540 11月 12 20:25 etc.tar.xz
...

# 创建bzip2压缩的归档文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ sudo tar cjf etc.tar.bz2 /etc/
 tar: 从成员名中删除开头的"/"

# 验证创建的bzip2压缩文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ ll
总计 3460
...
-rw-r--r-- 1 root    root    1156561 11月 12 20:26 etc.tar.bz2
-rw-rw-r-- 1 soveran soveran 1341774 11月 12 20:24 etc.tar.gz
-rw-r--r-- 1 root    root     976540 11月 12 20:25 etc.tar.xz
...

# 创建未压缩的归档文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ sudo tar cf etc.tar /etc/
 tar: 从成员名中删除开头的"/"

# 验证未压缩文件(体积最大)
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ ll
总计 11300
...
-rw-r--r-- 1 root    root    8028160 11月 12 20:27 etc.tar
-rw-r--r-- 1 root    root    1156561 11月 12 20:26 etc.tar.bz2
-rw-rw-r-- 1 soveran soveran 1341774 11月 12 20:24 etc.tar.gz
-rw-r--r-- 1 root    root     976540 11月 12 20:25 etc.tar.xz
...

# 创建不同的提取目录
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ mkdir /tmp/etc-{gz,bz2,xz}

# 提取不同压缩格式的归档文件到对应的目录
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar -xf etc.tar.gz -C /tmp/etc-gz/
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar -xf etc.tar.xz -C /tmp/etc-xz/
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar -xf etc.tar.bz2 -C /tmp/etc-bz2/

案例分析

  1. 压缩格式选项
    • -z--gzip:使用gzip压缩(生成.gz文件)
    • -j--bzip2:使用bzip2压缩(生成.bz2文件)
    • -J--xz:使用xz压缩(生成.xz文件)
    • 无压缩选项:创建未压缩的tar文件
  2. 压缩工具依赖
    • 案例展示了创建bzip2压缩文件时需要系统已安装bzip2工具
    • 当缺少必要的压缩工具时,tar命令会报错并失败
    • 安装相应的压缩工具后才能成功创建对应格式的压缩归档
  3. 压缩效率比较
    • 未压缩tar文件(etc.tar):8,028,160 字节(最大)
    • gzip压缩(etc.tar.gz):1,341,774 字节
    • bzip2压缩(etc.tar.bz2):1,156,561 字节
    • xz压缩(etc.tar.xz):976,540 字节(最小)
    • 这清晰展示了不同压缩算法的压缩效率:xz > bzip2 > gzip > 无压缩
  4. 压缩选项混用问题
    • 注意到一个重要细节:第一次尝试使用tar cjf etc.tar.xz时混用了bzip2选项(-j)和xz扩展名(.xz)
    • 后来使用正确的tar cJf etc.tar.xz创建了真正的xz压缩文件,且大小更小
    • 这表明选择正确的压缩选项与文件扩展名匹配很重要
  5. 绝对路径处理
    • 所有创建归档的命令都显示了警告:”tar: 从成员名中删除开头的’/’”
    • 这是tar的安全特性,默认会将绝对路径转换为相对路径,防止提取时覆盖系统文件
    • 可以使用-P选项保留绝对路径,但不建议在生产环境中使用
  6. 提取操作的一致性
    • 提取不同压缩格式的归档文件时,tar命令会自动识别压缩格式,无需指定解压选项
    • 所有提取命令都使用相同的格式:tar -xf 归档文件 -C 目标目录
    • 这展示了tar命令在提取操作上的便捷性和一致性
  7. 压缩算法特点
    • gzip:压缩/解压速度快,压缩率中等,广泛支持
    • bzip2:压缩率比gzip高,速度比gzip慢,资源消耗更多
    • xz:压缩率最高,但压缩/解压速度最慢,资源消耗最大
    • 无压缩:速度最快,无资源消耗,但文件体积最大
  8. 使用建议
    • 对于日常快速备份或传输,且对空间要求不高时,gzip是不错的选择
    • 对于归档存储且注重压缩率时,xz是最佳选择
    • 对于中等需求,bzip2提供了较好的平衡
    • 对于频繁访问的数据或需要快速处理的场景,考虑使用无压缩格式

12.13 案例:从文件列表创建归档

以下案例展示了如何使用tar命令的-T选项从文件列表创建归档文件:

# 创建包含文件路径列表的文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ echo '/etc/fstab' > tar_file_list
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ echo '/etc/hosts' >> tar_file_list
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ echo '/etc/passwd' >> tar_file_list

# 查看文件列表内容
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ cat tar_file_list
/etc/fstab
/etc/hosts
/etc/passwd

# 使用-T选项从文件列表创建压缩归档
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar -zcvf x.tar.gz -T tar_file_list
tar: 从成员名中删除开头的"/"
/etc/fstab
tar: 从硬连接目标中删除开头的"/"
/etc/hosts
/etc/passwd

# 验证归档内容
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar tvf x.tar.gz
-rw-r--r-- root/root       473 2025-10-21 06:50 etc/fstab
-rw-r--r-- root/root       223 2025-10-21 06:34 etc/hosts
-rw-r--r-- root/root      2997 2025-11-03 10:33 etc/passwd

案例分析

  1. 文件列表创建
    • 使用echo命令和重定向操作符(>>>)创建包含文件路径的列表文件
    • 文件列表中可以包含绝对路径或相对路径的文件
  2. -T选项的使用
    • -T--files-from选项告诉tar从指定的文件中读取要归档的文件列表
    • 语法格式:tar -T 文件列表文件 -f 输出归档文件
    • 在案例中,同时使用了-z(gzip压缩)、-c(创建)、-v(详细输出)和-f(指定归档文件)选项
  3. 路径处理特性
    • 注意到tar命令显示警告:”tar: 从成员名中删除开头的’/’”
    • 这是tar的安全机制,会自动将绝对路径转换为相对路径
    • 验证结果显示归档中的文件路径都变为相对路径格式(etc/fstab而非/etc/fstab)
  4. 权限和元数据保留
    • 归档保留了原始文件的权限(rw-r–r–)、所有者(root/root)、大小和时间戳信息
    • 这确保了归档文件的完整性和可恢复性
  5. 硬连接处理
    • 案例中显示了”tar: 从硬连接目标中删除开头的’/’“的警告
    • 这表明tar在处理硬连接时也应用了相同的路径安全转换规则
  6. 使用场景
    • 当需要归档大量分散在不同位置的文件时,文件列表方式比命令行参数更高效
    • 在自动化脚本中,可以通过动态生成文件列表来精确控制归档内容
    • 特别适合于增量备份或选择性归档场景
  7. 注意事项
    • 确保文件列表中的路径是可访问的,否则tar会跳过无法访问的文件
    • 如果需要保留绝对路径,可以使用-P选项,但这通常不推荐出于安全考虑
    • 对于非常大的文件列表,使用-T -可以从标准输入读取文件列表

12.14 案例:排除文件和目录

以下案例展示了如何使用tar命令的--exclude-X选项排除特定文件和目录:

# 创建临时目录并提取之前的归档文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ mkdir linshi
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar xf x.tar.gz -C linshi/

# 查看提取的文件结构
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tree linshi/
linshi/
└── etc
    ├── fstab
    ├── hosts
    └── passwd

2 directories, 3 files

# 使用--exclude选项从命令行排除多个文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar --exclude='linshi/etc/fstab' --exclude='linshi/etc/passwd' -zcvf linshi.tar.gz linshi/
linshi/
linshi/etc/
linshi/etc/hosts

# 验证归档内容(确认已排除指定文件)
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar tvf linshi.tar.gz
drwxrwxr-x soveran/soveran   0 2025-11-12 21:54 linshi/
drwxrwxr-x soveran/soveran   0 2025-11-12 21:54 linshi/etc/
-rw-r--r-- soveran/soveran 223 2025-10-21 06:34 linshi/etc/hosts

# 创建包含排除文件列表的文件
tar@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ echo 'linshi/etc/fstab' > exclude.txt
tar@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ echo 'linshi/etc/passwd' >> exclude.txt

# 使用-X选项从文件读取排除列表
tar@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar -X exclude.txt -zcvf linshi1.tar.gz linshi/
linshi/
linshi/etc/
linshi/etc/hosts

# 验证使用-X选项创建的归档内容
tar@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar tvf linshi1.tar.gz
drwxrwxr-x soveran/soveran   0 2025-11-12 21:54 linshi/
drwxrwxr-x soveran/soveran   0 2025-11-12 21:54 linshi/etc/
-rw-r--r-- soveran/soveran 223 2025-10-21 06:34 linshi/etc/hosts

# 查看tar命令的默认设置
tar@ubuntu24,10.0.0.13:~/mage/linux-basic/tar $ tar --show-defaults
--format=gnu -f- -b20 --quoting-style=escape --rmt-command=/usr/sbin/rmt --rsh-command=/usr/bin/rsh

案例分析

  1. –exclude选项的使用
    • --exclude选项允许在命令行中直接指定要排除的文件模式
    • 可以多次使用该选项来排除多个文件或目录
    • 语法格式:tar --exclude='模式1' --exclude='模式2' -f 归档文件 源文件/目录
  2. -X选项的使用
    • -X--exclude-from选项从指定的文件中读取要排除的文件模式列表
    • 当需要排除大量文件时,这种方式比在命令行中使用多个--exclude选项更方便
    • 语法格式:tar -X 排除列表文件 -f 归档文件 源文件/目录
  3. 路径匹配规则
    • 排除模式可以使用相对路径或绝对路径
    • 在案例中,使用的是相对于当前工作目录的路径(linshi/etc/fstab)
    • 模式匹配区分大小写,并且可以包含通配符(如*.tmp
  4. 排除效果验证
    • 归档结果显示,只有hosts文件被包含,而fstab和passwd文件已被成功排除
    • 使用tar tvf命令可以验证归档内容,确认排除操作是否成功
  5. 输出目录权限
    • 注意到归档中的目录权限与当前用户(soveran)相关,而不是原始文件的所有者
    • 这是因为在提取和重新打包过程中,文件所有权发生了变化
  6. –show-defaults选项
    • --show-defaults选项显示tar命令的默认设置
    • 这对于了解tar命令的行为和默认参数很有帮助
  7. 使用场景
    • 排除临时文件、缓存、日志或敏感数据
    • 在备份时排除不需要的文件以减少备份大小
    • 在创建软件发布包时排除源代码控制文件(如.git/)或构建临时文件
  8. 注意事项
    • 排除模式应该与tar处理文件路径的方式一致
    • 对于复杂的排除需求,使用-X选项通常比多个--exclude选项更清晰
    • 排除规则会应用于归档过程中遇到的所有文件

13. zip命令的基本使用

zip是Linux系统中另一个常用的压缩工具,它可以创建标准的ZIP格式压缩文件。以下案例展示了zip命令的基本使用方法:

# 创建测试目录并复制文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic $ mkdir zip ; cd zip
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/zip $ cp /etc/fstab /etc/passwd /etc/hosts ./

# 查看当前文件列表
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/zip $ ls
fstab  hosts  passwd

# 使用zip命令创建压缩文件(-v选项显示详细信息)
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/zip $ zip -v hosts.zip hosts
  adding: hosts (in=223) (out=147) (deflated 34%)
total bytes=223, compressed=147 -> 34% savings

# 查看创建的压缩文件信息
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/zip $ ll
总计 24
drwxrwxr-x 2 soveran soveran 4096 11月 12 22:48 ./
drwxrwxr-x 7 soveran soveran 4096 11月 12 22:48 ../
-rw-r--r-- 1 soveran soveran  473 11月 12 22:48 fstab
-rw-r--r-- 1 soveran soveran  223 11月 12 22:48 hosts
-rw-rw-r-- 1 soveran soveran  307 11月 12 22:48 hosts.zip
-rw-r--r-- 1 soveran soveran 2997 11月 12 22:48 passwd

# 向现有zip文件添加新文件
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/zip $ zip hosts.zip passwd
  adding: passwd (deflated 64%)

# 使用unzip命令列出压缩文件内容(不解压)
soveran@ubuntu24,10.0.0.13:~/mage/linux-basic/zip $ unzip -l hosts.zip
Archive:  hosts.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
      223  2025-11-12 22:48   hosts
     2997  2025-11-12 22:48   passwd
---------                     -------
     3220                     2 files

案例分析

  1. zip命令基本语法
    • 基本格式:zip [选项] 压缩文件名 源文件/目录
    • 在案例中,使用zip -v hosts.zip hosts创建了名为hosts.zip的压缩文件
  2. -v选项的作用
    • -v选项表示详细模式,显示压缩过程的详细信息
    • 输出包括原始文件大小(in=223)、压缩后大小(out=147)和压缩比例(deflated 34%)
    • 这有助于了解压缩效率和文件大小变化
  3. 向现有zip文件添加文件
    • zip命令允许向已存在的压缩文件添加新文件,只需指定相同的压缩文件名
    • 案例中使用zip hosts.zip passwd向hosts.zip添加了passwd文件
    • 注意添加文件时可以省略-v选项,这样不会显示详细信息
    • passwd文件的压缩率更高(64%),因为它包含更多可压缩的文本数据
  4. 压缩文件大小分析
    • 原始hosts文件大小为223字节
    • 压缩后的hosts.zip文件大小为307字节
    • 虽然压缩数据部分只有147字节,但ZIP格式包含额外的元数据和头部信息
    • 对于小文件,压缩文件可能会比原始文件稍大,因为格式开销的原因
  5. 压缩效率
    • 案例显示压缩率为34%,表示数据部分减小了34%
    • 对于文本文件,zip命令通常能提供较好的压缩率
  6. unzip命令的使用
    • unzip -l选项用于列出压缩文件内容而不解压
    • 输出显示了文件大小、日期时间和文件名信息
    • 这是查看压缩包内容的常用方法
  7. 常见zip选项
    • -r:递归压缩目录及其子目录
    • -q:安静模式,不显示压缩过程
    • -m:压缩后删除源文件
    • -j:不保存目录结构,只保存文件
    • -9:使用最高压缩级别
    • -1:使用最低压缩级别(最快)
  8. 使用场景
    • 创建跨平台兼容的压缩文件(Windows也原生支持ZIP格式)
    • 发送多个文件或目录通过电子邮件
    • 创建软件分发包
    • 临时压缩不常用但需要保留的文件以节省空间
  9. 注意事项
    • ZIP格式支持密码保护,可以使用-e选项加密
    • 默认情况下,zip会保留文件权限信息,但在不同系统间可能有差异
    • 对于大量小文件,ZIP格式的开销可能会影响整体压缩效率
    • zip命令不能直接在现有压缩文件中删除文件,但可以添加新文件

通过本文的学习,相信您已经掌握了Linux环境下各种打包压缩工具的使用方法和最佳实践。在实际工作中,灵活运用这些工具可以大大提高数据管理和系统维护的效率。记住,选择合适的工具和参数对于实现高效的数据处理至关重要。

文档信息

Search

    Table of Contents