| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- #!/usr/bin/env python3
- """
- 数据目录迁移脚本
- 将 data/ 目录迁移到 cache/data/ 目录下,实现统一的缓存管理。
- 注意:
- - 会保留 data/ 目录中的非缓存文件(如文档、配置等)
- - 只移动缓存性质的数据(爬虫数据、分析结果等)
- """
- import os
- import shutil
- from pathlib import Path
- def migrate_data_to_cache():
- """将 data 目录迁移到 cache/data"""
- project_root = Path(__file__).parent
- old_data_dir = project_root / "data"
- new_data_dir = project_root / "cache" / "data"
- print("=" * 60)
- print("数据目录迁移脚本")
- print("=" * 60)
- print(f"源目录: {old_data_dir}")
- print(f"目标目录: {new_data_dir}")
- print()
- # 检查源目录是否存在
- if not old_data_dir.exists():
- print("✓ data/ 目录不存在,无需迁移")
- return
- # 确保目标目录的父目录存在
- new_data_dir.parent.mkdir(parents=True, exist_ok=True)
- # 如果目标目录已存在,询问是否覆盖
- if new_data_dir.exists():
- print(f"⚠️ 目标目录已存在: {new_data_dir}")
- response = input("是否继续?这将合并两个目录的内容 (y/n): ")
- if response.lower() != 'y':
- print("取消迁移")
- return
- print("开始迁移...")
- print()
- # 统计信息
- total_files = 0
- total_dirs = 0
- skipped_items = []
- # 需要跳过的目录和文件(非缓存数据)
- skip_patterns = {
- '.git',
- '.DS_Store',
- '__pycache__',
- '*.md', # 文档文件
- '*.txt', # 说明文件
- 'README*',
- }
- # 遍历源目录
- for item in old_data_dir.iterdir():
- item_name = item.name
- # 检查是否应该跳过
- should_skip = False
- for pattern in skip_patterns:
- if pattern.startswith('*'):
- if item_name.endswith(pattern[1:]):
- should_skip = True
- break
- elif pattern.endswith('*'):
- if item_name.startswith(pattern[:-1]):
- should_skip = True
- break
- elif item_name == pattern:
- should_skip = True
- break
- if should_skip:
- skipped_items.append(item_name)
- print(f"⊘ 跳过: {item_name} (非缓存数据)")
- continue
- # 目标路径
- target = new_data_dir / item_name
- try:
- if item.is_dir():
- # 如果目标已存在,合并;否则直接移动
- if target.exists():
- print(f"→ 合并目录: {item_name}/")
- # 递归复制并删除源
- shutil.copytree(item, target, dirs_exist_ok=True)
- shutil.rmtree(item)
- else:
- print(f"→ 移动目录: {item_name}/")
- shutil.move(str(item), str(target))
- total_dirs += 1
- else:
- # 文件直接移动
- if target.exists():
- print(f"→ 覆盖文件: {item_name}")
- else:
- print(f"→ 移动文件: {item_name}")
- shutil.move(str(item), str(target))
- total_files += 1
- except Exception as e:
- print(f"✗ 移动失败: {item_name}")
- print(f" 错误: {e}")
- print()
- print("=" * 60)
- print("迁移完成!")
- print("=" * 60)
- print(f"移动的目录数: {total_dirs}")
- print(f"移动的文件数: {total_files}")
- if skipped_items:
- print(f"跳过的项目数: {len(skipped_items)}")
- print(f"跳过的项目: {', '.join(skipped_items)}")
- print()
- # 检查 data 目录是否为空
- remaining_items = list(old_data_dir.iterdir())
- if not remaining_items:
- print(f"✓ 源目录 {old_data_dir} 已空,可以删除")
- response = input("是否删除空的 data/ 目录?(y/n): ")
- if response.lower() == 'y':
- old_data_dir.rmdir()
- print(f"✓ 已删除 {old_data_dir}")
- else:
- print(f"⚠️ 源目录 {old_data_dir} 中还有以下内容:")
- for item in remaining_items:
- print(f" - {item.name}")
- print("这些可能是非缓存数据,已保留在原位置")
- print()
- print("=" * 60)
- print("下一步操作:")
- print("1. 验证迁移结果:检查 cache/data/ 目录中的数据是否完整")
- print("2. 如果一切正常,可以删除旧的 data/ 目录(如果为空)")
- print("3. 更新你的脚本或配置,使用新的路径")
- print("=" * 60)
- if __name__ == "__main__":
- migrate_data_to_cache()
|