132 lines
3.4 KiB
Python
132 lines
3.4 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
临时文件清理脚本
|
|
清理 result/ 目录下的过期临时文件
|
|
"""
|
|
|
|
import os
|
|
import shutil
|
|
import logging
|
|
from datetime import datetime, timedelta
|
|
from pathlib import Path
|
|
import argparse
|
|
|
|
logging.basicConfig(
|
|
level=logging.INFO,
|
|
format='%(asctime)s - %(levelname)s - %(message)s'
|
|
)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def get_dir_age_days(dir_path: Path) -> float:
|
|
"""获取目录的年龄(天数)"""
|
|
try:
|
|
mtime = dir_path.stat().st_mtime
|
|
age = datetime.now() - datetime.fromtimestamp(mtime)
|
|
return age.total_seconds() / 86400
|
|
except Exception:
|
|
return 0
|
|
|
|
|
|
def cleanup_result_dir(
|
|
result_dir: str = "result",
|
|
max_age_days: int = 7,
|
|
dry_run: bool = False
|
|
) -> dict:
|
|
"""
|
|
清理 result 目录下的过期文件
|
|
|
|
Args:
|
|
result_dir: 结果目录路径
|
|
max_age_days: 最大保留天数
|
|
dry_run: 是否只预览不删除
|
|
|
|
Returns:
|
|
清理统计信息
|
|
"""
|
|
result_path = Path(result_dir)
|
|
|
|
if not result_path.exists():
|
|
logger.warning(f"目录不存在: {result_dir}")
|
|
return {"error": "目录不存在"}
|
|
|
|
stats = {
|
|
"total_dirs": 0,
|
|
"deleted_dirs": 0,
|
|
"kept_dirs": 0,
|
|
"freed_bytes": 0,
|
|
"errors": 0,
|
|
}
|
|
|
|
logger.info(f"开始清理 {result_dir},保留 {max_age_days} 天内的文件")
|
|
|
|
for item in result_path.iterdir():
|
|
if not item.is_dir():
|
|
continue
|
|
|
|
stats["total_dirs"] += 1
|
|
age_days = get_dir_age_days(item)
|
|
|
|
if age_days > max_age_days:
|
|
# 计算目录大小
|
|
try:
|
|
dir_size = sum(f.stat().st_size for f in item.rglob('*') if f.is_file())
|
|
except Exception:
|
|
dir_size = 0
|
|
|
|
if dry_run:
|
|
logger.info(f"[预览] 将删除: {item.name} (年龄: {age_days:.1f} 天, 大小: {dir_size / 1024:.1f} KB)")
|
|
else:
|
|
try:
|
|
shutil.rmtree(item)
|
|
logger.info(f"已删除: {item.name} (年龄: {age_days:.1f} 天)")
|
|
stats["deleted_dirs"] += 1
|
|
stats["freed_bytes"] += dir_size
|
|
except Exception as e:
|
|
logger.error(f"删除失败: {item.name}, 错误: {e}")
|
|
stats["errors"] += 1
|
|
else:
|
|
stats["kept_dirs"] += 1
|
|
|
|
logger.info(f"清理完成: 删除 {stats['deleted_dirs']} 个目录, "
|
|
f"保留 {stats['kept_dirs']} 个目录, "
|
|
f"释放 {stats['freed_bytes'] / 1024 / 1024:.2f} MB")
|
|
|
|
return stats
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="清理临时文件")
|
|
parser.add_argument(
|
|
"--dir", "-d",
|
|
default="result",
|
|
help="要清理的目录 (默认: result)"
|
|
)
|
|
parser.add_argument(
|
|
"--days", "-n",
|
|
type=int,
|
|
default=7,
|
|
help="保留天数 (默认: 7)"
|
|
)
|
|
parser.add_argument(
|
|
"--dry-run",
|
|
action="store_true",
|
|
help="只预览,不实际删除"
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
|
|
stats = cleanup_result_dir(
|
|
result_dir=args.dir,
|
|
max_age_days=args.days,
|
|
dry_run=args.dry_run
|
|
)
|
|
|
|
print(f"\n统计信息: {stats}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|