前言
惯例:声明:本文章仅供学习,个人经验之作,不承担任何责任。
这个疫情,人麻了,复工回来,身边的人走光了。
旧时代的残党
需求描述:
项目中存储了大量的图片文件,长期会占用磁盘空间。
定时删除文件,
定时删除文件夹下面的文件
定时删除给定目录下所有子文件但是不破坏文件目录。
定时删除多少天前的文件。
后台运行,且写个日志文件。
解决思路:
1.现在有文件的原因是因为视频流截帧之后,会做一个存的动作。方便把图片输入模型进行识别。这样做逻辑顺,容易排查错误,底图可以存下来,方便数据收集,排查错误等等。
2.截完帧的frame直接传给模型。
方法1:
使用python语言删除文件:os.remove(filename)
基础逻辑:
给定一个文件路径,遍历循环该路径下的所有子文件,
加一个判断日期,符合要求的文件remove掉。
lastmodifytime = os.stat(filename).st_mtime
判断是目录,则进去子目录,保持当前目录的结构不变
elif os.path.isdir(filename):
deletefile(filename)
关于定时这个问题,我没有解决,因为没有严格要求。
使用了time函数中自带的sleep函数
while True:
deletefile(path)
time.sleep(86400)
那么是否可以设置为每天早上凌晨2点删除呢?
整体代码如下:
#!/bin/python
# coding:utf-8
import time
import os, sys
# 设置删除多少天前的文件
N = 3
# 要删除路径
path = r'/yourpath'
def deletefile(path):
for eachfile in os.listdir(path):
filename = os.path.join(path, eachfile)
if os.path.isfile(filename):
lastmodifytime = os.stat(filename).st_mtime
# 设置删除多久之前的文件
endfiletime = time.time() - 3600 * 24 * N
if endfiletime > lastmodifytime:
# if filename[-4:] == ".log":
os.remove(filename)
print("删除文件 %s 成功" % filename)
# 如果是目录则递归调用当前函数
elif os.path.isdir(filename):
deletefile(filename)
def run_py(py_name,log_dir):
cmd="nohup python -u {} >>{} 2>&1 &".format(py_name,log_dir)
print(cmd)
os.system(cmd)
if __name__ == '__main__':
cmd = "nohup python -u yourpythoncode.py >>yourlogfilename 2>&1 &"
while True:
deletefile(path)
time.sleep(86400)
说会话感觉这种方法有点呆,因为rm或者定时器都没有用,但是效果出奇的好。
后台执行则打这段代码:
nohup python -u yourpythoncode.py >>yourlogfilename 2>&1 &
OK啦,这段代码的效果是,每天检查一次,删除三天前的文件。
我试了试,确实好用,能解决问题。
但是有没有更好用的呢?
方法二:利用rm,linux指令
2022年6月9日补充
上次说到,方法一是为了解决问题,搞项目的懂的都懂。
然后俺寻思了一下。
import time,os,subprocess
from datetime import datetime
def run_cmd(cmd):
child=subprocess.Popen(cmd,shell=True)
child.wait()
def do_work():
cmd_list=["rm -rf {}/*".format(yourpathname),#这里是一个文件夹
"rm -rf {}".format(yourfilename1),#这里可以是一个log或者单个文件
"rm -rf {}".format(yourfilename2)
]
for cmd in cmd_list:
run_cmd(cmd)
sleep_time=24*60*60
while True:
now_time=datetime.now().strftime('%Y%m%d%H%M%S')
print(now_time)
#20220609083314
if now_time[7]=='2':#定时删,比如某月的几号删,每天的几点删
do_work()
print("work! work!",now_time)
else:
print("keep sleep!",now_time)
#time.sleep(sleep_time)
这次优化的好处是。
第一:我可以利用cmd,实现删某个文件夹下所有文件和某个文件。
第二:利用对datatime的检索,实现定时删。
好吧这也算。
OK,到这里我认为应该是完全够用了。
那么到后面可能会出现更优解或者更好的方法。
学海无涯