2

使用zstd压缩你的文件

 1 year ago
source link: https://www.bboy.app/2023/01/09/%E4%BD%BF%E7%94%A8zstd%E5%8E%8B%E7%BC%A9%E4%BD%A0%E7%9A%84%E6%96%87%E4%BB%B6/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

使用zstd压缩你的文件

January 9, 2023
20230109-1.webp

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

需求很简单,如下

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

调研的压缩工具

上面的大家都可以试下,最终我选择的是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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK