首页 公告 项目 RSS

使用zstd压缩你的文件

January 9, 2023 本文有 683 个字 需要花费 2 分钟阅读

简介

先说下我之前的文件备份流程,如果是很多小文件的话,直接一个压缩包,如果是照片什么的话直接源文件同步备份到百度云,后来发现一个问题,就是如果你不加密去上传你的文件的话,很有可能被偷窥,毕竟是国内的网盘,所以就想着需要压缩,并且需要加密

需求

需求很简单,如下

  • 打包
  • 支持cpu多核心压缩
  • 压缩比高
  • 加密
  • 分卷压缩(有的单文件太大,网盘不支持上传)

调研的压缩工具

  • zip
  • pigz
  • gzip
  • xz
  • zstd

上面的大家都可以试下,最终我选择的是zstd,zstd在各方面的表现都是比较优秀的,而且支持各种语言的库。

关于zstd

大家详细的可以看官网介绍

http://facebook.github.io/zstd/

打包压缩的命令

下面是我的脚本,大家可以参考下

#!/bin/bash
set -e
password=$1 #密码
path=$2 #压缩文件夹的路径
basename=`basename $path` #目录名字
time=$(date "+%Y-%m-%d")-$RANDOM #时间后缀

echo "开始备份" $path
start=$(date +%s) #开始备份的时间
mkdir $time #创建时间目录
#开始打包压缩
tar --use-compress-program="zstd -15 -T8" -cf  - $basename |openssl enc -aes-128-cbc  -salt -pbkdf2 -k $password  -out $basename-$time.tar.zst 
#开始切割文件
split -d -b 1024m  $basename-$time.tar.zst $time/$basename-$time.tar.zst.
#删除打包文件
rm -rf $basename-$time.tar.zst
#结束备份的时间
end=$(date +%s) 
take=$(( end - start ))
echo $path 备份完成,花费了 $take 秒

使用方法

bash backup.sh 123 /Users/bboysoul/bin

  • 123 是候密码
  • /Users/bboysoul/bin 是需要打包的路径

解压的命令

#!/bin/bash
password=$1 #密码
path=$2 #压缩文件夹的路径
basename=`basename $path` #目录名字
cat $path/* > $basename.tar.zst
openssl enc -aes-128-cbc -d -k $password -salt -pbkdf2 -in $basename.tar.zst | tar --use-compress-program="zstd -d" -xf -
rm -rf $basename.tar.zst

使用方法

bash backup.sh 123 2023-01-09-26185

同样

  • 123 是候密码
  • 2023-01-09-26185 是压缩文件夹的路径

解释下脚本关键的几句

  • tar --use-compress-program="zstd -15 -T8" -cf - $basename |openssl enc -aes-128-cbc -salt -pbkdf2 -k $password -out $basename-$time.tar.zst

zstd -15 -T8 中 -15 表示压缩等级,默认是3,数字越大压缩之后的文件越小并且压缩的时间越久,这个大家根据自己的需求修改。-T 表示压缩的线程,如果是0的话就是直接等于系统的cpu核心数

  • split -d -b 1024m $basename-$time.tar.zst $time/$basename-$time.tar.zst.

-b 表示分割后的单文件大小

  • openssl enc -aes-128-cbc -d -k $password -salt -pbkdf2 -in $basename.tar.zst | tar --use-compress-program="zstd -d" -xf -

zstd -d -d 表示解压

欢迎关注我的博客www.bboy.app

Have Fun