完整了解tar的使用及其有意思的花活

常用参数

主要的操作模式(只能用一个)

  • -c/--create 创建 tar 文件
  • --delete 从 tar 文件中删除某个文件
  • -r/--append 往 tar 文件尾部追加文件
  • -u/--update 更新 tar 文件中的文件
  • -t/--list 查看 tar 文件中的文件
  • -x/--extract/--get 从 tar 文件解压文件

解压缩选项

  • -z/--gzip/--gunzip/--ungzip 过滤gzip方式压缩的文件(.tar.gz/.tgz)
  • -j/--bzip2 过滤bzip2方式压缩的文件(.tar.bz2)
  • -J/--xz 过滤xz方式压缩的文件(.tar.xz/.txz)
  • -Z/--compress/--uncompress 过滤compress方式压缩的文件

其他选项

  • -f/--file=ARCHIVE 操作的 tar 文件路径,此参数后必须跟文件路径名

    • -f - 操作对象在标准输入/输出
  • -C/--directory 操作目录/解压后文件放置的目录

  • -v:显示所有过程

  • -O:将文件解开后,将内容打印到标准输出

TLDR

创建 tar 文件

1
2
3
4
5
6
7
# 创建 tar 包
tar cvf xx.tar /tmp/1.txt /tmp/2.txt
# 创建使用 gzip/uncompress/bzip2/xz 压缩过 tar 包
tar czvf xx.tar.gz /tmp/1.txt /tmp/2.txt
tar cZvf xx.tar.Z /tmp/1.txt /tmp/2.txt
tar cjvf xx.tar.bz2 /tmp/1.txt /tmp/2.txt
tar cJvf xx.tar.xz /tmp/1.txt /tmp/2.txt

粗略测试下压缩的效果和压缩的时间,tar.Z 的没创建成功,每种不同的压缩方式运行的时间也不尽相同

粗略结论:gzip/bz2 压缩是比较折中的选项,压缩后的大小还行,时间也能接受

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 压缩所用的时间排序 xz > bz2 > gz > none
$ time tar cf hi.tar file1 file2 dir1
tar cf hi.tar file1 file2 dir1 0.01s user 0.25s system 95% cpu 0.277 total

$ time tar czf hi.tar.gz file1 file2 dir1
tar czf hi.tar.gz file1 file2 dir1 5.66s user 0.39s system 103% cpu 5.867 total

$ time tar cJf hi.tar.xz file1 file2 dir1
tar cJf hi.tar.xz file1 file2 dir1 62.73s user 1.15s system 100% cpu 1:03.42 total

$ time tar cjf hi.tar.bz2 file1 file2 dir1
tar cjf hi.tar.bz2 file1 file2 dir1 15.90s user 0.35s system 99% cpu 16.277 total

# 压缩后的大小排序 none > gz > bz2 > xz
$ ls -lh hi.tar hi.tar.bz2 hi.tar.gz hi.tar.xz
-rw-rw-r-- 1 ubuntu ubuntu 196M Jan 5 14:14 hi.tar
-rw-rw-r-- 1 ubuntu ubuntu 105M Jan 5 14:13 hi.tar.bz2
-rw-rw-r-- 1 ubuntu ubuntu 109M Jan 5 14:14 hi.tar.gz
-rw-rw-r-- 1 ubuntu ubuntu 99M Jan 5 14:12 hi.tar.xz

解压 tar 文件

1
2
3
4
5
6
7
8
# 一拳超人
tar xvf xx.tar/xx.tar.gz/xx.tar.xz/xx.tar.bz2/xx.tar.Z
# 或者画蛇添足
tar xvf xx.tar
tar xzvf xx.tar.gz
tar xZvf xx.tar.Z
tar xjvf xx.tar.bz2
tar xJvf xx.tar.xz

解压 tar 文件中的某一个文件

1
tar -xf archive.tar.xz file1 dir2

解压其他压缩文件

1
2
3
4
5
6
7
8
9
10
11
12
# 解压 rar, 可能需要先安装 sudo apt install -y unrar
unrar e file.rar
# 解压 zip
unzip file.zip
# 解压 gzip
gzip/gunzip -d file.gz
# 解压 bzip2
bzip2/bunzip2 -d file.bz2
# 解压 Z
uncompress -d file.Z
# 解压 xz
xz -d file.xz

查看 tar 包内容,加 v 可以看到权限、用户等详细信息。

1
tar tvf source.tar

添加新文件(压缩后的不能追加)

1
tar rvf target.tar appended-file.txt

整花活

从 Pod 中拷贝数据时,可能会用到 kubectl cp,但是执行这个命令,在目标容器中必须存在 tar 命令,也就是它依赖于 tar 命令来实现拷贝功能。有几个比较有意思的命令:

  1. 本地 -> Pod
1
tar cf - /tmp/foo | kubectl exec -i -n <some-namespace> <some-pod> -- tar xf - -C /tmp/bar
  1. Pod -> 本地
1
kubectl exec -n <some-namespace> <some-pod> -- tar cf - /tmp/foo | tar xf - -C /tmp/bar

通过标准输入/输出来传递要拷贝的文件/目录,这花活整得挺秀。尝试着整了一些其他类似的花活:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 想直接输出到 terminal,失败了
$ tar cjf - a.txt b.txt
tar: Refusing to write archive contents to terminal (missing -f option?)
tar: Error is not recoverable: exiting now

# 创建压缩的 tar 包
tar cjf - a.txt b.txt > hi.tar.bz2

# 输出压缩后的 tar 包内容
tar cjf - a.txt b.txt | cat

# 创建后查看内容(太搞笑了)
$ tar cjf - a.txt b.txt | tar tjvf -
-rw-rw-r-- ubuntu/ubuntu 1174 2022-12-13 14:09 a.txt
-rwxrwxr-x ubuntu/ubuntu 2623 2022-12-22 09:46 b.txt

还找到一个下载 kernel 代码时的用法,优雅~

1
curl https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.3.tar.xz | tar xJf -

完整了解tar的使用及其有意思的花活

https://eucham.me/2023/01/05/1fb01c4e1eec.html

作者

遇寻

发布于

2023-01-05

更新于

2023-01-06

许可协议

评论