距离上次更新本文已经过去了 282 天,文章部分内容可能已经过时,请注意甄别

tar 命令打包 | 查看压缩文件 | 打包时忽略文件 等操作

1. 起因

今天下午写阿狸 bot 的代码的时候,写错了 aiofiles 的保存操作

python
1
2
3
4
5
6
7
8
# 正确写法
async def write_file_aio(path:str, value):
async with aiofiles.open(path, 'w', encoding='utf-8') as f:
await f.write(json.dumps(value, indent=2, sort_keys=True,ensure_ascii=False))

# 错误写法
# 前面是一样的
await f.write(json.dump(value, indent=2, sort_keys=True,ensure_ascii=False))

注意这两个函数,一个是 json.dump;一个是 json.dumps

就是因为这里写错了,导致 bot 执行全局变量保存的时候,所有文件都没有成功保存 —— 还直接把本地文件清空了!!!

QQ图片20220419103148

当时的我是真的欲哭无泪啊,都不知道如何是好

image-20230116214455718

vscode 的时间线功能帮我保存了一部分文件,可是绝大部分文件都是程序生成的,没有经过 vscode,其自然也就没有保存历史版本,这可给我整难受了

image-20230116215109060

image-20230116215127228

要不是之前有一个 val-bot-test 目录用于代码测试,那就几乎等同于阿狸 bot 的用户信息全部丢失,最最最最难受的,还是我 bot 记录了好久的服务器日志啊,本来有 3w 多 cmd 的,现在恢复的文件还是几个月前的,数据量少了好多……


唉,不说这些玩意了,今天我们要来康康怎么在 linux 下用 tar 命令打包和压缩文件夹,留作备份!

2.tar 命令打包

参考 https://blog.csdn.net/catoop/article/details/40651947

2.1 将整个目录打包

以当前目录下的 code 文件夹为例

bash
1
2
3
tar -cvf ./code.tar ./code #仅打包不压缩
tar -zcvf ./code.tar.gz ./code #打包,gzip压缩
tar -jcvf ./code.tar.bz2 ./code #打包,bzip2压缩

注意,这里的./code.tar 是生成的目标文件,./code 是源路径;目标文件的命名没有要求,命名成 tar.gz/tar.bz2 只是一个用于标明的好习惯

2.2 查看压缩包里面的文件

下面的命令是分别查看不同压缩格式的压缩包里面的文件目录的,其会直接在 bash 打印出来

plaintext
1
2
3
tar -tvf ./code.tar 
tar -ztvf ./code.tar.gz
tar -jtvf ./code.tar.bz2

2.3 解压文件

解压的文件会默认存在当前目录

plaintext
1
2
3
tar -xvf ./code.tar 
tar -zxvf ./code.tar.gz
tar -jxvf ./code.tar.bz2

2.4 解压一部分文件

假设我们需要解压 code.tar 里面 test 目录的文件,可以用下面的命令

plaintext
1
tar -xvf ./code.tar test

知道这几个用法,就基本够用了!

2.5 打包的时候忽略一些文件

现在我需要压缩的是 code 里面的 python 运行代码,其中会有一个没有用的__pycache_,我们应该将其忽略,以减小压缩包体积

下面的命令就是忽略 code 路径下所有__pycache__文件或者文件目录

bash
1
tar -zcvf code.tar.gz --exclude=*__pycache__ code

注意,忽略的路径后面不需要带 /,否则还是会被打包。比如下面的用法就是错的

bash
1
tar -zcvf code.tar.gz --exclude=*__pycache__/ code # 错误用法!

3. 一定要多多备份

像我今天出现这样的情况,实在是不应该!

阿狸 bot 是有 vip 业务的,vip 信息文件的丢失,也很有可能会导致 vip 用户的丢失。更别提还有广大的普通用户在使用阿狸呢。

平时我知道要在云盘、nas 备份自己的代码、笔记、学习资料等等个人文件,却忘记了云服务器上的 bot 同样需要备份

image-20230116220931405

这下可算是吸取教训了,一次性把所有 bot 都给备份了!