Bootstrap

Linux 命令之 tar

1 tar 命令介绍

常见的压缩包有 .tar.gz、.tar.xz、.tar.bz2,以及 .rar、.zip、.7z 等压缩包。

常见的 tar 选项:
    - 1. 文件操作选项:
        -c, --create    : 创建一个新压缩文件
        -x, --extract   : 解压文件
    
    - 2. 解压缩选项:
        -j, --bzip2     : 使用 bzip2 算法解压缩文件
        -J, --xz        : 使用 xz 算法解压缩文件
        -z, --gzip      : 使用 gzip 算法解压缩文件
    
    - 3. 其它选项:
        -f, --file      : 使用压缩包名称。该参数必须是最后一个参数,且后面只能跟文件名
        -v, --verbose   : 打印处理的文件
        -C, --directory : 解压到指定目录

2 压缩与解压缩

不同压缩包的压缩与解压速度比较参见:https://blog.csdn.net/zzz3265/article/details/121871829

lz4、lzop 压缩时间快但压缩率堪忧;lzma、xz 压缩率优秀但耗时较长;gzip 则两者兼顾;

2.1 压缩

假如我有一个 a.c 文件,需要分别生成各种压缩包。

# 生成 tar.bz2 压缩包
tar -cjvf a.tar.bz2 a.c

# 生成 tar.xz 压缩包
tar -cJvf a.tar.xz a.c

# 生成 tar.gz 压缩包
tar -czvf a.tar.gz a.c

系统如果已经安装 zip,则可以使用 zip -r filename.zip file/path 生成 .zip 压缩包(-r 表示递归压缩)。

同样的,使用 rar a filename.rar file/path 生成 .rar 压缩包
rar 安装包下载地址:https://www.rarlab.com/rar/rarlinux-x64-6.0.0.tar.gz

而 .7z 压缩包的生成见其它文章,ubuntu 系统安装 7z 命令:apt install p7zip-full

2.2 解压

# 解压 tar.bz2 压缩包
tar -xjvf a.tar.bz2

# 解压 tar.xz 压缩包
tar -xJvf a.tar.xz

# 解压 tar.gz 压缩包
tar -xzvf a.tar.gz

使用 unzip filename.zip 解压 .zip 文件;

使用 rar x filename.rar 解压 .rar 文件

4 高级用法

4.1 排除目录

实际生成压缩包时,我们可能需要排除一些日志文件、缓存文件、版本管理文件等:

C:.
│
└─tar_test              # 根目录
    │  a.c              # 根目录下的源文件
    │
    ├─.git              # 版本管理目录
    │  │  config
    ......
    ├─b                 # 模块目录
    │      b.c
    │      b.h
    │
    ├─imgs              # 图片目录
    │      test.jpg
    │
    ├─include           # 根目录下的头文件目录
    │      a.h
    │
    └─logs              # 日志目录
            tar.log

1)仅排除日志目录:tar -czvf tar_test.tar.gz --exclude=tar_test/logs tar_test/

关于 --exclude 后面的路径:
    1. 不可以是绝对路径,如 /root/tar_test/logs 
    2. 不能通过 ./ 指定相对路径,如 ./tar_test/logs
    3. 路径不能以 / 开始,如 /tar_test/logs
    4. 路径不能以 / 结束,如 tar_test/logs/
    5. --exclude 需要位于压缩路径前方

2)排除版本管理目录 .git:tar -czvf tar_test.tar.gz --exclude-vcs tar_test/

3)只压缩头文件:tar -czvf tar_test.tar.gz --exclude-vcs --exclude=tar_test/imgs --exclude=tar_test/logs --exclude=tar_test/*.c tar_test/

4.2 显示进度

4.2.1 脚本解压缩

git-bash 与 ubuntu 系统验证通过。

#!/bin/bash

#/##
 # 使用 tar 解压文件,显示解压进度
 #
 # @author Aaron
 # @since  2020/05/07
 # @param  $1 解压目标文件,需要指定当前路径或绝对路径
 # @param  $2 文件名
 # @param  $3 目录路径
 #
 #/
uncompress() {
    TOTAL_SIZE=$(gzip -l $1 | grep '%' | awk '{print $2}')
    BLOCK_SIZE=$(expr $TOTAL_SIZE / 51200)
    BLOCK_SIZE=$(expr $BLOCK_SIZE + 1)
    tar --blocking-factor=$BLOCK_SIZE --checkpoint=1   \
    --checkpoint-action="ttyout=$2 解压中: %u%\r" -zxf $1 -C $3
}

uncompress U-Boot.tar.gz uboot bak

其中:$1 是要解压的文件;awk '{print $2}' 命令中的 $2 是管道传递过来的参数不用管,ttyout 后面的 $2 是指解压时的自定义提示内容;$3 指要解压到的目标路径。

使用 “uncompress U-Boot.tar.gz u-boot bak” 命令调用该函数,结果如下:

4.2.2 命令解压缩
pv ${FILE_NAME} | tar -zxf -

4.2.3 压缩进度
#!/bin/bash

#/##
 # 使用 tar 压缩文件,显示解压进度
 #
 # @author Aaron
 # @since  2020/05/07
 # @param  $1 要压缩的文件目录
 # @param  $2 要生成的文件名称
 #
 #/
compress() {
    tar -cf - $1 | pv -s $(($(du -sk $1 | awk '{print $1}') * 1024)) | gzip > $2
}

compress bak/U-Boot uboot.tar.gz

WSL 中的 ubuntu 测试如下:

;