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