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