You've already forked parser_1cmycloud
mirror of
https://github.com/vanyagoncharov/parser_1cmycloud.git
synced 2026-06-19 17:18:10 +02:00
165 lines
6.8 KiB
Python
165 lines
6.8 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
Скрипт для удаления номеров страниц из названий папок
|
|
Переименовывает: page_123_Название -> Название
|
|
"""
|
|
|
|
import os
|
|
import re
|
|
import sys
|
|
import io
|
|
from pathlib import Path
|
|
|
|
# Настройка UTF-8 для вывода в консоль (для Windows)
|
|
if sys.platform == 'win32':
|
|
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
|
|
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace')
|
|
|
|
def remove_page_numbers(pages_dir='pages', dry_run=True):
|
|
"""
|
|
Удаляет номера страниц из названий папок
|
|
|
|
Args:
|
|
pages_dir: Директория с папками страниц
|
|
dry_run: Если True - только показывает что будет сделано
|
|
"""
|
|
pages_path = Path(pages_dir)
|
|
|
|
if not pages_path.exists():
|
|
print(f"❌ Директория {pages_dir} не найдена!")
|
|
return
|
|
|
|
print(f"🔍 Сканирую папки в {pages_dir}...\n")
|
|
|
|
# Рекурсивно находим все папки с форматом page_XXX_*
|
|
all_folders = []
|
|
|
|
def scan_folder(folder_path, depth=0):
|
|
"""Рекурсивно сканирует папки"""
|
|
try:
|
|
for item in sorted(folder_path.iterdir()):
|
|
if item.is_dir():
|
|
# Проверяем формат: page_XXX_*
|
|
match = re.match(r'page_(\d+)_(.+)', item.name)
|
|
if match:
|
|
page_num = match.group(1)
|
|
new_name = match.group(2)
|
|
|
|
# Убираем " _ 1С_Предприятие.Элемент" в конце
|
|
if new_name.endswith(' _ 1С_Предприятие.Элемент'):
|
|
new_name = new_name[:-len(' _ 1С_Предприятие.Элемент')]
|
|
|
|
all_folders.append({
|
|
'path': item,
|
|
'old_name': item.name,
|
|
'new_name': new_name,
|
|
'page_num': page_num,
|
|
'depth': depth
|
|
})
|
|
|
|
# Рекурсивно сканируем вложенные папки
|
|
scan_folder(item, depth + 1)
|
|
except PermissionError as e:
|
|
print(f"⚠️ Нет доступа к папке: {folder_path}")
|
|
|
|
scan_folder(pages_path)
|
|
|
|
print(f"📊 Найдено папок для переименования: {len(all_folders)}\n")
|
|
|
|
if not all_folders:
|
|
print("✅ Папок для переименования не найдено!")
|
|
return
|
|
|
|
# Сортируем по глубине (от глубоких к верхним) чтобы избежать конфликтов
|
|
all_folders.sort(key=lambda x: x['depth'], reverse=True)
|
|
|
|
print("📋 План переименования:\n")
|
|
|
|
# Группируем по глубине для красивого вывода
|
|
by_depth = {}
|
|
for folder in all_folders:
|
|
depth = folder['depth']
|
|
if depth not in by_depth:
|
|
by_depth[depth] = []
|
|
by_depth[depth].append(folder)
|
|
|
|
for depth in sorted(by_depth.keys()):
|
|
print(f" Уровень {depth}: {len(by_depth[depth])} папок")
|
|
|
|
print()
|
|
|
|
# Показываем первые 10 примеров
|
|
print("Примеры переименования (первые 10):")
|
|
for i, folder in enumerate(all_folders[:10]):
|
|
indent = " " * folder['depth']
|
|
print(f"{indent}📦 {folder['old_name']}")
|
|
print(f"{indent} → {folder['new_name']}")
|
|
|
|
if len(all_folders) > 10:
|
|
print(f" ... и еще {len(all_folders) - 10} папок")
|
|
|
|
print()
|
|
|
|
if dry_run:
|
|
print("⚠️ Режим DRY RUN - файлы не будут переименованы")
|
|
print(" Запустите с --apply для применения изменений")
|
|
return
|
|
|
|
# Применяем переименование
|
|
print("🚀 Применяю переименование...\n")
|
|
renamed = 0
|
|
errors = 0
|
|
skipped = 0
|
|
|
|
for folder in all_folders:
|
|
try:
|
|
old_path = folder['path']
|
|
new_path = old_path.parent / folder['new_name']
|
|
|
|
# Проверяем что источник существует
|
|
if not old_path.exists():
|
|
print(f" ⚠️ Пропускаю (не существует): {folder['old_name']}")
|
|
skipped += 1
|
|
continue
|
|
|
|
# Проверяем что цель не существует
|
|
if new_path.exists() and new_path != old_path:
|
|
print(f" ⚠️ Пропускаю (уже существует): {folder['new_name']}")
|
|
skipped += 1
|
|
continue
|
|
|
|
# Переименовываем
|
|
old_path.rename(new_path)
|
|
renamed += 1
|
|
|
|
if renamed <= 20 or renamed % 100 == 0:
|
|
indent = " " * folder['depth']
|
|
print(f"{indent}✓ {folder['old_name']} → {folder['new_name']}")
|
|
|
|
except Exception as e:
|
|
errors += 1
|
|
print(f" ❌ Ошибка при переименовании {folder['old_name']}: {e}")
|
|
|
|
print(f"\n{'='*60}")
|
|
print(f"✅ Переименование завершено!")
|
|
print(f" Переименовано: {renamed}")
|
|
print(f" Пропущено: {skipped}")
|
|
print(f" Ошибок: {errors}")
|
|
print(f"{'='*60}")
|
|
|
|
if __name__ == '__main__':
|
|
import argparse
|
|
|
|
parser = argparse.ArgumentParser(description='Удаление номеров страниц из названий папок')
|
|
parser.add_argument('--pages-dir', type=str, default='pages',
|
|
help='Директория с папками страниц (по умолчанию: pages)')
|
|
parser.add_argument('--apply', action='store_true',
|
|
help='Применить изменения (по умолчанию: только показать план)')
|
|
|
|
args = parser.parse_args()
|
|
|
|
print("🗂️ Удаление номеров страниц из названий папок\n")
|
|
remove_page_numbers(args.pages_dir, dry_run=not args.apply)
|
|
|