#!/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()