import os import shutil import re ROOT = "assets/slike" # Configuration for each folder CONFIG = { "liki": [ (r"kai", "Kai"), (r"ana", "Ana"), (r"gronk", "Gronk"), (r"(npc|druid|witch|farmer|baker|priest|guide|merchant|trader|kid|man|woman|girl|boy)", "NPCs"), (r".*", "Ostalo") ], "teren": [ (r"(tree|bush|flower|plant|rastlina|drevo)", "Rastline"), (r"(grass|ground|soil|dirt|sand|tileset|trava|zemlja)", "Tla"), (r"(water|voda|river|lake)", "Voda"), (r"(stone|rock|kamen|skala)", "Kamni"), (r"(house|building|wall|ruin|fence|zgradba|his|hiลก)", "Zgradbe"), (r"(prop|lamp|sign|cart)", "Props"), (r".*", "Ostalo") ], "predmeti": [ (r"(tool|axe|pickaxe|hoe|watering|orodje|kramp|sekira)", "Orodje"), (r"(weapon|sword|bow|arrow|gun|rifle|orozje|meฤ)", "Orozje"), (r"(seed|seme)", "Semena"), (r"(food|crop|fruit|veg|hrana|pridelek)", "Hrana"), (r"(resource|wood|plank|ore|gem|gold|surovina)", "Surovine"), (r".*", "Ostalo") ] # We skip 'animations' (already done) and 'DEMO/FAZA' folders (too complex to guess without breaking phases) # But wait, user said "vse ostale mape". FAZA_1/teren should also be organized? # Yes, ideally. } def organize_recursive(base_path, rules): print(f"๐Ÿ“‚ Organizing in {base_path}...") count = 0 # Get files in the immediate folder (not recursive, to avoid moving already sorted files) try: files = [f for f in os.listdir(base_path) if os.path.isfile(os.path.join(base_path, f))] except FileNotFoundError: return 0 for filename in files: if not filename.lower().endswith(('.png', '.jpg', '.jpeg')): continue fname_lower = filename.lower() target_sub = "Ostalo" for pattern, folder in rules: if re.search(pattern, fname_lower): target_sub = folder break # Don't move 'Ostalo' if it implies staying in root? # Actually user wants subfolders. So 'Ostalo' subfolder is fine. dest_dir = os.path.join(base_path, target_sub) if not os.path.exists(dest_dir): os.makedirs(dest_dir) src = os.path.join(base_path, filename) dst = os.path.join(dest_dir, filename) try: shutil.move(src, dst) count += 1 except Exception as e: print(f"Error {filename}: {e}") return count def main(): print("๐Ÿš€ STARTING GLOBAL ORGANIZATION...") # We need to find ALL occurrences of 'liki', 'teren', 'predmeti' # even inside DEMO, FAZA_1 etc. total_moved = 0 for root, dirs, files in os.walk(ROOT): # Identify if current 'root' matches one of our targets folder_name = os.path.basename(root) if folder_name in CONFIG: # Apply rules for this folder total_moved += organize_recursive(root, CONFIG[folder_name]) # Optimization: Don't recurse into the folders we just created (Kai, Ana...) # But os.walk creates the list 'dirs' upfront. # We can modify 'dirs' in-place to prune. # If we just organized 'liki', we created 'Kai', 'Ana'. We shouldn't process 'liki/Kai' as 'liki'. # Since 'Kai' is not in CONFIG keys, it will be skipped automatically. # Perfect. print("="*40) print(f"โœ… GLOBAL ORGANIZATION COMPLETE. Moved {total_moved} files.") print("="*40) if __name__ == "__main__": main()