This commit is contained in:
2025-12-30 10:55:03 +01:00
parent 570336390e
commit ec611f4dea

153
TestduplicitSyncThing.py Normal file
View File

@@ -0,0 +1,153 @@
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()