import pymysql import sys import os from tqdm import tqdm # ============================== # ⚙️ NASTAVENÍ # ============================== # Soubor je nyní přímo ve složce s tímto skriptem PHYSICAL_LIST_FILE = "physical_files_list.txt" # DB Nastavení DB_CONFIG = { "host": "192.168.1.76", "port": 3307, "user": "root", "password": "Vlado9674+", "database": "torrents", } # ============================== def get_db_paths(): print("📡 Stahuji seznam cest z MySQL (to chvilku potrvá)...") paths = set() try: conn = pymysql.connect(**DB_CONFIG) cursor = conn.cursor() # Stáhneme VŠECHNY cesty, které jsou v #ColdData # LIKE optimalizace: MySQL použije index, pokud sloupec full_path má index sql = "SELECT full_path FROM file_md5_index WHERE full_path LIKE '/mnt/user/#ColdData/%'" cursor.execute(sql) for row in cursor.fetchall(): paths.add(row[0]) conn.close() except Exception as e: sys.exit(f"❌ Chyba DB: {e}") return paths def main(): print("🚀 AUDIT: Fyzický disk vs. Databáze") print(f"📂 Vstup: {PHYSICAL_LIST_FILE} (Lokální)") print("=====================================================") if not os.path.exists(PHYSICAL_LIST_FILE): sys.exit(f"❌ Soubor '{PHYSICAL_LIST_FILE}' nenalezen ve složce projektu!") # 1. Načíst DB do paměti db_paths = get_db_paths() print(f"✅ V DB načteno: {len(db_paths):,} záznamů.") # 2. Příprava na hledání "Ghost files" ghost_check_set = db_paths.copy() # 3. Spočítat řádky pro progress bar print("⏳ Sčítám řádky v souboru...", end="\r") try: total_lines = sum(1 for _ in open(PHYSICAL_LIST_FILE, 'r', encoding='utf-8', errors='ignore')) except: total_lines = 0 # 4. Porovnání print(f"🔍 Jdu porovnávat {total_lines:,} souborů...") missing_in_db = 0 found_ok = 0 physical_count = 0 f_missing = open("report_CHYBI_V_DB.txt", "w", encoding="utf-8") with open(PHYSICAL_LIST_FILE, "r", encoding="utf-8", errors="ignore") as f: with tqdm(total=total_lines, unit="file", dynamic_ncols=True) as pbar: for line in f: line = line.strip() if not line: continue # Očekáváme formát: /mnt/user/.../soubor|velikost try: parts = line.rsplit("|", 1) path = parts[0] except IndexError: continue physical_count += 1 # --- KONTROLA --- if path in db_paths: found_ok += 1 # Odebrat ze seznamu duchů (našli jsme ho) if path in ghost_check_set: ghost_check_set.remove(path) else: # Je na disku, není v DB missing_in_db += 1 f_missing.write(f"{path}\n") pbar.update(1) f_missing.close() # Zbytek jsou duchové ghost_files = list(ghost_check_set) with open("report_NAVIC_V_DB.txt", "w", encoding="utf-8") as f_ghost: f_ghost.write("TOTO JSOU ZÁZNAMY V DB, KTERÉ NA DISKU NEEXISTUJÍ:\n") for p in ghost_files: f_ghost.write(f"{p}\n") print("\n\n📊 VÝSLEDEK AUDITU") print("=====================================================") print(f"💾 Fyzických souborů: {physical_count:,}") print(f"✅ V pořádku (V DB): {found_ok:,}") print("-----------------------------------------------------") print(f"❌ CHYBÍ V DB (Re-index): {missing_in_db:,}") print(f" -> 'report_CHYBI_V_DB.txt'") print("-----------------------------------------------------") print(f"👻 NAVÍC V DB (Smazat): {len(ghost_files):,}") print(f" -> 'report_NAVIC_V_DB.txt'") print("=====================================================") if __name__ == "__main__": main()