Skip to content

tar

tar是一个打包工具,其中提供了对应的选项来使用相应的工具来在打包后进行压缩或解压缩。

基本使用

tar 的使用需要指定操作(Operations)和选项(Options),他们都使用选项形式(Long Style or Short Style),其中操作是必须指定的,而选项并不是必须的:

Bash
tar operation[option1 option2 ...] [file-name1 file-name2 ...]

tar 有八个 Operation(实际上就是增删改查以及相应的变种):

  • -c/--create: 创建一个新的 tar 存档
  • -t/--list: 列出存档的内容
  • -x/--extract: 从存档中提取一个或多个成员,需要注意的是他会自动覆盖已有的文件
  • -r/--append: 将文件附加到存档的末尾
  • -u/--update: 更新存档,如果不存在等同于 -r,如果存在会比较是否更新
  • --delete: 从存档中删除成员
  • -A/--catenate: 合并两个 tar 存档
  • -d/--diff/--compare: 将存档成员与文件系统中的文件进行比较
Bash
# 创建
tar --create --verbose --file=collection.tar blues folk jazz
# 可以指定文件夹,但是需要注意创建的 tar 文件不能包含在指定的文件夹里
tar -cvf collection.tar .   # 报错 ./collection.tar is the archive; not dumped
# 要想压缩到指定目录可以 --file 指定全路径
tar -cvf ~/Documents/collection.tar .

# 列出存档
tar -tvf collection.tar

# 提取整个存档
tar -xvf collection.tar
# 提取存档中一个或多个文件
tar -xvf collection.tar blues

# 将文件添加到现有的存档中
tar -xvf collection.tar append_file

# 合并 tar
tar -Avf collection.tar other.tar

tar options 有些基础选项,几乎可以配合任何操作:

  • -f <archive-name>/--file=<archive-name>: 指定存档文件的名称
  • -v/--verbose: 形式详细信息,例如--list操作默认只会打印成员名称,如果指定了-v会显示一个完整的 ls 风格的成员列表, 可以指定-vv来显示更详细的信息

tar 存档为其包含的每个成员保留其元数据(修改时间、模式、所有权等),tar 提供了一些选项运行覆盖这些值:

  • --mode=<premissions>: 指定权限(chmod 相关的参数),--mod='a+rw'
  • --mtime=<date>: 指定 tar 成员的修改时间
  • --owner=<user>: 指定 tar 成员的所有者
  • --group=<group>: 指定 tar 成员的所属组

默认情况下 tar 会归档全部的内容,这对于指定文件来说没有问题,但是当我们指定一个要要说文件夹并且希望排除一些文件时就会比较麻烦,不过 tar 提供了一些选项来让我们排除一些文件:

  • --exclude=<pattern>: 忽略匹配 pattern 的文件
  • --exclude-vcs-ignores: 归档目录之前,会查看要归档的目录下的.gitignore等 vcs 忽略文件,也会排除这里定义的文件的信息
  • --exclude-ignore=<file>: 指定 vcs 忽略文件
  • --exclude-vcs: 忽略版本控制系统使用的目录(例如 git 中的 .git/ .gitignore 等)

tar 归档也好,解包也好都是以当前工作目录作为相对目录来操作的,tar 提供了一个选项来更改这个工作目录:

  • -C <dir-path>/--directory=<dir-path>: 更改文件目录, 他有两个用处一种是归档的时候更改可以选择多个文件夹路径的文件,一种是解包的时候指定要解包到的文件夹, 可以指定多个
Bash
# 归档
# ./grape
# ./prune
# ./food/cherry
tar -cvf jams.tar grape prune -C food cherry

# 解包到指定文件夹内
tar -xvf collection.tar -C ./test/inner

压缩

tar 仅仅是归档工具,所谓的归档就是将多个文件(文件夹)归一到单一文件中。不过我们可以归档后使用 compress 来进行压缩,tar 提供了参数来自动实现这一点:

参数 后缀 压缩程序
--gzip/-z .gz/.tgz/.taz gzip
--compress/-Z .Z/.taZ compress
--bzip2/-j .bz2/.tz2/.tbz2/.tbz bzip2
--lzma .lzma/.tlz lzma
--xz/-J .xz xz
--zstd .zst/.tzst zstd

Note

xz 和 lzma 使用的都是 lzma 算法,不过 xz 添加了更加详细的元信息, zstd 可以看作是 zlib 的高级版本,他更加的快速。 在 linux 下后缀名通常没有意义,不过一些约定俗成的后缀名能够让我们知道文件的意义。 解压缩并不需要指定属性,tar 会自动调用对应的程序来处理。