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 测试如下: