# tar 命令

虽然 `zip` 命令能够很好地将数据压缩和归档进单个文件，但是目前，Unix 和 Linux 上广泛使用的归档工具是 `tar` 命令。

`tar` 命令开始是用来将文件写到磁带设备上归档的，然而它也能把输出写到文件里，这种用法在 Linux 上已经普遍用来归档数据了。 利用 `tar` 命令，可以把一大堆的文件和目录全部打包成一个文件，这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。

## 打包和压缩

* 打包：将一大堆文件或目录变成一个总的文件；
* 压缩：将一个大的文件通过一些压缩算法变成一个小文件；

为什么要区分打包和压缩呢？这源于 Linux 中很多压缩程序只能针对一个文件进行压缩，这样当你想要压缩一大堆文件时，你得先将这一大堆文件先打成一个包（`tar` 命令），然后再用压缩程序进行压缩（`gzip`、`bzip2` 命令等）。

## 命令用法

```
$ tar function [options] object1 object2 ...
```

`function` 参数定义了 `tar` 命令应该做什么，如下表所示：

| 功能 | 长名称           | 描述                                    |
| -- | ------------- | ------------------------------------- |
| -A | --concatenate | 将一个已有的 tar 归档文件追加到另一个已有 tar 归档文件      |
| -c | --create      | 创建一个新的归档文件                            |
| -d | --diff        | 检查归档文件和文件系统的不同之处                      |
| -r | --append      | 追加文件到已有 tar 归档文件末尾                    |
| -t | --list        | 列出已有 tar 归档文件的内容                      |
| -u | --update      | 将比 tar 归档文件中已有的同名文件新的文件追加到该 tar 归档文件中 |
| -x | --extract     | 从已有 tar 归档文件中提取文件                     |

## 常用可选参数

| 参数      | 说明                      |
| ------- | ----------------------- |
| -C dir  | 切换到指定目录                 |
| -f file | 输出结果到文件或设备 `file`       |
| -j      | 将输出重定向给 `bzip2` 命令来压缩内容 |
| -p      | 保留所有文件权限                |
| -v      | 在处理文件时显示文件              |
| -z      | 在输出重定向给 `gzip` 命令来压缩内容  |

## 使用实例

1. 创建名为 test.tar 的归档文件，包含 test 和 test2 目录内容

   ```
    $ tar -cvf test.tar test/ test2/
   ```
2. 列出 test.tar 的内容（但并不提取文件）

   ```
    $ tar -tf test.tar
   ```
3. 提取 test.tar 的内容

   ```
    $ tar -xvf test.tar
   ```
