#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ WAV 文件夹自动清理监控器 实时监控 /mnt/nvme1data/Digital_Human/Image_Analysis/wav/wav 目录 当 WAV 文件数量超过 20 条时,自动删除最旧的文件 """ import os import time import logging from pathlib import Path from datetime import datetime # 配置日志 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler('/mnt/nvme1data/Digital_Human/Image_Analysis/wav_cleaner.log'), logging.StreamHandler() ] ) logger = logging.getLogger(__name__) class WavFolderMonitor: """WAV 文件夹监控器""" def __init__(self, watch_dir, max_files=20, check_interval=5): """ 初始化监控器 Args: watch_dir: 监听的目录路径 max_files: 最大文件数量(默认20) check_interval: 检查间隔(秒,默认5秒) """ self.watch_dir = Path(watch_dir) self.max_files = max_files self.check_interval = check_interval # 确保目录存在 self.watch_dir.mkdir(parents=True, exist_ok=True) logger.info(f"🎯 WAV 文件夹监控器已初始化") logger.info(f" 监听目录: {self.watch_dir}") logger.info(f" 最大文件数: {self.max_files}") logger.info(f" 检查间隔: {self.check_interval}秒") def get_wav_files(self): """获取所有 WAV 文件,按修改时间排序""" wav_files = list(self.watch_dir.glob('*.wav')) # 按修改时间排序(最新的在后) wav_files.sort(key=lambda p: p.stat().st_mtime) return wav_files def cleanup_old_files(self): """清理超过限制的最旧文件""" try: wav_files = self.get_wav_files() file_count = len(wav_files) if file_count > self.max_files: # 需要删除的文件数量 delete_count = file_count - self.max_files logger.warning(f"⚠️ 文件数量 ({file_count}) 超过限制 ({self.max_files})") logger.warning(f" 准备删除最旧的 {delete_count} 个文件...") # 删除最旧的文件 for i in range(delete_count): old_file = wav_files[i] try: file_size = old_file.stat().st_size file_age = time.time() - old_file.stat().st_mtime logger.info(f" 🗑️ 删除: {old_file.name}") logger.info(f" 大小: {file_size / 1024:.2f} KB") logger.info(f" 年龄: {file_age / 60:.1f} 分钟") old_file.unlink() except Exception as e: logger.error(f" ❌ 删除失败 {old_file.name}: {e}") logger.info(f"✅ 清理完成,剩余文件: {self.max_files}") return delete_count else: logger.debug(f"✓ 文件数量正常: {file_count}/{self.max_files}") return 0 except Exception as e: logger.error(f"❌ 清理文件时出错: {e}") return 0 def monitor(self): """开始监控循环""" logger.info("🚀 开始监控 WAV 文件夹...") logger.info("按 Ctrl+C 停止监控") check_count = 0 try: while True: check_count += 1 logger.debug(f"--- 第 {check_count} 次检查 ---") # 执行清理 deleted = self.cleanup_old_files() # 每次清理后显示当前状态 current_files = self.get_wav_files() if current_files: newest = current_files[-1] newest_age = (time.time() - newest.stat().st_mtime) / 60 logger.info(f"📊 当前状态: {len(current_files)} 个文件 | 最新: {newest.name} ({newest_age:.1f}分钟前)") else: logger.info("📊 当前状态: 0 个文件") # 等待下一次检查 time.sleep(self.check_interval) except KeyboardInterrupt: logger.info("\n🛑 收到停止信号,监控已停止") except Exception as e: logger.error(f"❌ 监控过程中出错: {e}") raise def main(): """主函数""" # 配置路径 watch_dir = '/mnt/nvme1data/Digital_Human/Image_Analysis/wav/wav' max_files = 20 check_interval = 3600 # 每小时检查一次 # 创建监控器 monitor = WavFolderMonitor( watch_dir=watch_dir, max_files=max_files, check_interval=check_interval ) # 启动监控 monitor.monitor() if __name__ == "__main__": main()