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

1.起因

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

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文件夹为例

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打印出来

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

2.3 解压文件

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

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

2.4 解压一部分文件

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

1
tar -xvf ./code.tar test

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

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

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

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

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

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

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

3.一定要多多备份

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

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

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

image-20230116220931405

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