import os import pymysql import sys # ============================== # ⚙️ NASTAVENÍ # ============================== LOCAL_ROOT = r"U:\#Syncthing" # DB Připojení DB_HOST = "192.168.1.76" DB_PORT = 3307 # Port pro tvou DB DB_USER = "root" DB_PASS = "Vlado9674+" # Tvé heslo DB_NAME = "torrents" DB_TABLE = "file_md5_index" REMOTE_SHARE_KEY = "#ColdData" # ============================== def get_db_connection(): try: return pymysql.connect( host=DB_HOST, port=DB_PORT, user=DB_USER, password=DB_PASS, database=DB_NAME, cursorclass=pymysql.cursors.DictCursor ) except Exception as e: print(f"❌ CHYBA: Nelze se připojit k MySQL na {DB_HOST}:{DB_PORT}.") print(f" Detail: {e}") sys.exit(1) def normalize_path(path): """ 1. Převede Windows '\\' na Linux '/' 2. Převede vše na malá písmena (aby 'Foto.jpg' == 'foto.JPG') """ return path.replace("\\", "/").lower() def get_local_files(root_path): print(f"📂 Skenuji lokální disk: {root_path}") local_files = set() if not os.path.exists(root_path): print(f"❌ Chyba: Cesta {root_path} neexistuje.") return local_files count = 0 for root, dirs, files in os.walk(root_path): # Ignorovat systémové složky Syncthingu if ".stfolder" in dirs: dirs.remove(".stfolder") if ".stversions" in dirs: dirs.remove(".stversions") for file in files: full_path = os.path.join(root, file) try: rel_path = os.path.relpath(full_path, root_path) except ValueError: continue # NORMALIZACE (Lomítka + Malá písmena) clean_path = normalize_path(rel_path) local_files.add(clean_path) count += 1 if count % 1000 == 0: print(f" ... načteno {count} lokálních souborů ...", end="\r") print(f"✅ Lokálně nalezeno: {len(local_files):,} souborů.") return local_files def get_remote_files_from_db(): print(f"📡 Připojuji se k DB '{DB_NAME}' a stahuji seznam...") conn = get_db_connection() remote_files = set() try: with conn.cursor() as cursor: sql = f"SELECT full_path FROM {DB_TABLE} WHERE full_path LIKE %s" cursor.execute(sql, (f"%/{REMOTE_SHARE_KEY}/%",)) rows = cursor.fetchall() print(f" ... DB vrátila {len(rows):,} řádků. Zpracovávám...") for row in rows: full_path_db = row['full_path'] if f"/{REMOTE_SHARE_KEY}/" in full_path_db: parts = full_path_db.split(f"/{REMOTE_SHARE_KEY}/") if len(parts) > 1: rel_path = parts[1] # NORMALIZACE (Lomítka + Malá písmena) clean_path = normalize_path(rel_path) remote_files.add(clean_path) finally: conn.close() print(f"✅ V DB nalezeno: {len(remote_files):,} unikátních cest.") return remote_files def main(): print("🚀 HLEDÁNÍ DUPLIKÁTŮ (Case Insensitive)") print("=======================================") local_set = get_local_files(LOCAL_ROOT) remote_set = get_remote_files_from_db() print("\n🔍 Porovnávám (všechna písmena ignorují velikost)...") # Průnik duplicates = local_set.intersection(remote_set) only_local = local_set - remote_set print("\n📊 VÝSLEDKY") print("=======================================") print(f"🏠 Celkem lokálně: {len(local_set):,}") print(f"☁️ Celkem v DB: {len(remote_set):,}") print("---------------------------------------") print(f"👯 SHODA (DUPLIKÁTY): {len(duplicates):,}") print(f"🆕 UNIKÁTNÍ (JEN DOMA): {len(only_local):,}") print("=======================================\n") if duplicates: file_dup = "report_DUPLIKATY.txt" with open(file_dup, "w", encoding="utf-8") as f: for item in sorted(duplicates): f.write(f"{item}\n") print(f"💾 Seznam duplikátů (malá písmena) uložen do: {file_dup}") if only_local: file_new = "report_NOVE_SOUBORY.txt" with open(file_new, "w", encoding="utf-8") as f: for item in sorted(only_local): f.write(f"{item}\n") print(f"💾 Seznam nových souborů uložen do: {file_new}") input("\nStiskni ENTER pro ukončení...") if __name__ == "__main__": main()