跳过导航

linux 一些知识点

`tar` 是 Linux 中非常核心的归档工具,尤其在部署、Docker、Linux 运维中非常常见。

你刚才遇到的问题:

```
gzip -> tar -> jar
```

就是典型的多层打包。

---

# 1. tar 是什么?

`tar` 全称:

> Tape Archive(磁带归档)

最开始用于磁带备份,现在主要用于:

* 打包多个文件
* 保留目录结构
* 保留权限
* 配合 gzip 压缩

注意:

**tar 本身只负责打包,不负责压缩。**

例如:

```
a.txt
b.txt
c.txt
```

执行:

```bash
tar -cf test.tar a.txt b.txt c.txt
```

得到:

```
test.tar
```

里面包含:

```
a.txt
b.txt
c.txt
```

但是大小基本没有减少。

---

# 2. tar 参数解释

最常见:

```bash
tar -参数 文件
```

例如:

```bash
tar -xf xxx.tar
```

拆开:

```
tar
 |
 +-- -x
 |
 +-- -f
```

---

## -x

### extract

意思:

> 解包 / 提取

记忆:

```
x = eXtract
```

例如:

```bash
tar -xf app.tar
```

表示:

```
app.tar
        |
        v
解压出来
```

---

## -f

### file

意思:

> 指定操作的文件

记忆:

```
f = File
```

例如:

```bash
tar -xf app.tar
```

这里:

```
-f app.tar
```

表示:

"我要操作 app.tar"

---

## -c

### create

创建 tar 包

记忆:

```
c = Create
```

例如:

```bash
tar -cf backup.tar /etc/nginx
```

意思:

创建:

```
backup.tar
```

里面包含:

```
/etc/nginx
```

---

## -t

### table

查看内容列表

记忆:

```
t = Table
```

例如:

```bash
tar -tf app.tar
```

查看:

```
app.tar
```

里面有什么。

你刚才用:

```bash
tar -tf bin/QYPark-server.jar
```

就是:

```
t = 查看目录
f = 指定文件
```

输出:

```
QYPark-server.jar
```

说明里面还有一层。

---

## -v

### verbose

显示详细过程

记忆:

```
v = verbose
```

例如:

```bash
tar -xvf app.tar
```

显示:

```
x app/
x app/config.yml
x app/bin/start.sh
```

没有 `v`

```bash
tar -xf app.tar
```

可能没有输出。

---

## -z

gzip

记忆:

```
z = gzip
```

例如:

```bash
tar -zcf app.tar.gz app/
```

表示:

```
app目录
   |
   v
tar打包
   |
   v
gzip压缩
```

生成:

```
app.tar.gz
```

---

# 3. 最常用组合(重点记)

## ① 解压 tar

90% 场景:

```bash
tar -xf xxx.tar
```

例如:

```bash
tar -xf release.tar
```

含义:

```
x = 解包
f = 文件
```

---

## ② 解压 tar.gz

Linux 最常见:

```bash
tar -zxf xxx.tar.gz
```

含义:

```
z = gzip
x = extract
f = file
```

口诀:

> gz 包,先 z;解包 x;文件 f

---

## ③ 打包 tar

```bash
tar -cf xxx.tar directory/
```

例如:

```bash
tar -cf backup.tar /data
```

口诀:

```
c = create
f = file
```

---

## ④ 打包并 gzip

最常见备份:

```bash
tar -zcf backup.tar.gz /data
```

口诀:

```
zcf

z 压缩
c 创建
f 文件
```

---

## ⑤ 查看 tar 内容

非常重要:

```bash
tar -tf xxx.tar
```

口诀:

```
t = 看目录 table
f = 文件
```

例如:

不知道包里面有什么:

```bash
tar -tf xxx.tar
```

先看。

---

## ⑥ 指定解压目录

生产环境非常常用:

```bash
tar -xf app.tar -C /opt/app
```

解释:

```
-C
=
Change directory
```

意思:

解到:

```
/opt/app
```

---

# 4. 一个完整生命周期

比如发布:

```
项目目录

app/
├── bin/
├── conf/
└── logs/
```

---

## 打包

```bash
tar -zcf app.tar.gz app/
```

得到:

```
app.tar.gz
```

---

## 上传服务器

---

## 查看

```bash
tar -tf app.tar.gz
```

看到:

```
app/
app/bin/
app/conf/
```

---

## 解压

```bash
tar -zxf app.tar.gz
```

恢复:

```
app/
├── bin
├── conf
└── logs
```

---

# 5. 和 gzip 的区别(容易混)

很多新人这里容易混。

## gzip

只能压一个文件:

```bash
gzip app.jar
```

结果:

```
app.jar.gz
```

不能:

```
目录/
 ├──a
 ├──b
 └──c
```

---

## tar

可以打包目录:

```
目录
 |
 v
一个文件
```

但是不压缩。

所以组合:

```
tar
负责整理
+
gzip
负责压缩
```

形成:

```
.tar.gz
```

---

# 6. 给你一个运维记忆口诀

我建议记这个:

```
tar 四兄弟:

c  create 创建包
x  extract 解包
t  table 查看包
f  file 指定文件

z  gzip 压缩
v  verbose 看过程
C  change 目标目录
```

组合:

| 需求       | 命令                            |
| -------- | ----------------------------- |
| 查看包      | `tar -tf xxx.tar`             |
| 解 tar    | `tar -xf xxx.tar`             |
| 解 tar.gz | `tar -zxf xxx.tar.gz`         |
| 打 tar    | `tar -cf xxx.tar dir`         |
| 打 tar.gz | `tar -zcf xxx.tar.gz dir`     |
| 解到指定目录   | `tar -zxf xxx.tar.gz -C /opt` |

---

结合你这次云效问题:

实际链路就是:

```
QYPark-server.jar

tar -cf

QYPark-server.jar.tar

gzip

QYPark-server.jar.tar.gz

下载时错误改名

QYPark-server.jar
```

所以你用:

```bash
file
```

逐层判断:

```
gzip compressed data
        ↓ gzip -d
POSIX tar archive
        ↓ tar -xf
Zip archive data

java -jar
```

这套排查思路在 Linux 部署里非常常用。你这次实际上踩到了一个很典型的 **制品多层封装问题**