TravelContentCreator/scripts/cleanup_temp_files.py

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()