+Warwagon MVC Posted May 24, 2023 MVC Share Posted May 24, 2023 File Renamer 3.5 This is an app that chatGPT helped me create. I modified some of the code. It lets sync the file names from a source directory to a destination directory if both files are identical and all that was changed was the file's name. This way you don't have to recopy the file all over again. Version 3.5.1 Fixed a bug, where if a file had a specifically formatted file name it would get incorrectly renamed and shortened. Change log Version 3.5 Change log Added the "Save folder paths" to save the file paths for both A and B Added the "Load Folder Paths" to load the folder paths for A and B. Version 3.1 Change log Brand new UI A save button to save the output of the scan a progress bar If a collision, all the files have been renamed, or there are no files found to be renamed you can't click Continue Renaming, the button is dead. The scan results are now displayed in a table format resizeable window The words "collision found" appears in red at the top All dialog boxes removed The list of files is now scrollable Version 2.3 Change log Fixed a bug causing the app to hang while scanning a directory with 1000+ files in the corruption detection, the text file now tells you the file (s) in both A and B that caused the collision. Version 2.0 Change log After selecting A and B it checks both A and B for collisions and if any are found the program stops. If it finds collisions in either directory it saves the results of both directories to a folder on the desktop called collisions.txt. Once The collisions are fixed or if it doesn't find any the program proceeds Normally. Changed the collision detection to look check the file name as well as the first word of the file name minus the extension. Plus the modified date and time from before. import os import re import tkinter as tk from tkinter import filedialog from tkinter import messagebox from tkinter import ttk IGNORED_EXTENSIONS = ['.srt', '.nfo', '.sub'] def get_folder_path(entry): folder_path = filedialog.askdirectory() entry.delete(0, tk.END) entry.insert(0, folder_path) def compare_folders(): folder_a = folder_a_entry.get() folder_b = folder_b_entry.get() tree.delete(*tree.get_children()) file_sizes_a = {} for filename in os.listdir(folder_a): if os.path.isfile(os.path.join(folder_a, filename)) and not filename.endswith(('.srt', '.nfo', '.sub')): file_sizes_a[filename] = os.path.getsize(os.path.join(folder_a, filename)) file_names_b = [] file_sizes_b = {} for filename in os.listdir(folder_b): if os.path.isfile(os.path.join(folder_b, filename)) and not filename.endswith(('.srt', '.nfo', '.sub')): file_names_b.append(filename) file_sizes_b[filename] = os.path.getsize(os.path.join(folder_b, filename)) differences = [] for filename_a, size_a in file_sizes_a.items(): matched = False for filename_b, size_b in file_sizes_b.items(): if size_a == size_b: name_b, ext_b = os.path.splitext(filename_b) if not re.search(r'\(\d{4}\)$', name_b): differences.append((filename_a, filename_b)) matched = True break for diff in differences: tree.insert('', 'end', values=diff) check_collisions(folder_b) # Call check_collisions function after comparing folders def check_collisions(folder_b): file_sizes = {} collisions = {} for filename in os.listdir(folder_b): file_extension = os.path.splitext(filename)[1].lower() if os.path.isfile(os.path.join(folder_b, filename)) and file_extension not in IGNORED_EXTENSIONS: size = os.path.getsize(os.path.join(folder_b, filename)) if size in file_sizes: if size not in collisions: collisions[size] = [] collisions[size].extend([file_sizes[size], filename]) else: file_sizes[size] = filename if collisions: report = "Collision Detected:\n\n" for size, filenames in collisions.items(): report += f"Files with size {size} bytes:\n" report += " - ".join(filenames) report += "\n\n" messagebox.showwarning("Collision Detected", report) else: messagebox.showinfo("No Collisions", "No collisions found in the directory.") def rename_files(): folder_b = folder_b_entry.get() skipped_count = 0 renamed_count = 0 for child in tree.get_children(): filename_a, filename_b = tree.item(child)['values'] new_path = os.path.join(folder_b, filename_a) if not os.path.exists(new_path): os.rename(os.path.join(folder_b, filename_b), new_path) renamed_count += 1 else: skipped_count += 1 summary_message = f"Renamed files: {renamed_count}\nSkipped files: {skipped_count}" messagebox.showinfo('Renaming Summary', summary_message) def save_folder_paths(): folder_a = folder_a_entry.get() folder_b = folder_b_entry.get() save_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=(("Text Files", "*.txt"), ("All Files", "*.*"))) if save_path: with open(save_path, 'w') as file: file.write(f"Folder A: {folder_a}\n") file.write(f"Folder B: {folder_b}") messagebox.showinfo('Save', 'Folder paths saved successfully.') def load_folder_paths(): load_path = filedialog.askopenfilename(filetypes=(("Text Files", "*.txt"), ("All Files", "*.*"))) if load_path: with open(load_path, 'r') as file: content = file.read() folder_a_match = re.search(r"Folder A: (.+)", content) folder_b_match = re.search(r"Folder B: (.+)", content) if folder_a_match and folder_b_match: folder_a = folder_a_match.group(1).strip() folder_b = folder_b_match.group(1).strip() folder_a_entry.delete(0, tk.END) folder_a_entry.insert(0, folder_a) folder_b_entry.delete(0, tk.END) folder_b_entry.insert(0, folder_b) messagebox.showinfo('Load', 'Folder paths loaded successfully.') else: messagebox.showwarning('Load', 'Invalid file format. Please select a valid text file.') root = tk.Tk() folder_a_entry = tk.Entry(root) folder_a_entry.pack() tk.Button(root, text="Use these names in Folder A", command=lambda: get_folder_path(folder_a_entry)).pack() folder_b_entry = tk.Entry(root) folder_b_entry.pack() tk.Button(root, text="To rename files in this folder, Folder B", command=lambda: get_folder_path(folder_b_entry)).pack() tk.Button(root, text="Compare Folders", command=compare_folders).pack() tree = ttk.Treeview(root, columns=('Folder A', 'Folder B'), show='headings') tree.heading('Folder A', text='Folder A') tree.heading('Folder B', text='Folder B') tree.pack(side='top', fill='both', expand=True, padx=10, pady=10) tk.Button(root, text="Rename Files", command=rename_files).pack() tk.Button(root, text="Save Folder Paths", command=save_folder_paths).pack() tk.Button(root, text="Load Folder Paths", command=load_folder_paths).pack() root.mainloop() Link to comment https://www.neowin.net/forum/topic/1429506-a-python-script-which-syncs-file-names-between/ Share on other sites More sharing options...
binaryzero Posted May 24, 2023 Share Posted May 24, 2023 It's not difficult to understand, you've renamed the file so backup software is going to assume it's a new file. The contents of the file may be the same, but backup software isn't going to make assumptions like that. If you want incremental\checksum comparisons etc, the file is going to need to be the same name. Sure it may do some deduping in the background to compress the media set, but it is going to show the file with the amended file name. If I have a media set, and files have been renamed, I want to be able to go back through the backup sets and see the differences, regardless if the file contents is the same. You could write some PowerShell to compare the checksum of files in two locations; have it assume that if a file's checksum in Location A (source) matches that of a file in Location B (dest), rename file in Location B to match Location A, else copy file to location B. Yonah 1 Share Link to comment https://www.neowin.net/forum/topic/1429506-a-python-script-which-syncs-file-names-between/#findComment-598823211 Share on other sites More sharing options...
binaryzero Posted May 24, 2023 Share Posted May 24, 2023 https://www.neowin.net/sponsored/get-the-starting-with-windows-powershell-cheatsheet-by-java-code-geeks-for-free/ Yonah 1 Share Link to comment https://www.neowin.net/forum/topic/1429506-a-python-script-which-syncs-file-names-between/#findComment-598823224 Share on other sites More sharing options...
neoraptor Posted May 24, 2023 Share Posted May 24, 2023 (edited) You can try https://freefilesync.org/ with "content" method when comparing, haven't tried it. The other option is to go to you backup and rename them there as well manually before sync. Update: Probably won't work if you are not using it already (before the rename) https://freefilesync.org/manual.php?topic=synchronization-settings - Detect Moved Files Link to comment https://www.neowin.net/forum/topic/1429506-a-python-script-which-syncs-file-names-between/#findComment-598823298 Share on other sites More sharing options...
+Warwagon MVC Posted May 24, 2023 Author MVC Share Posted May 24, 2023 On 24/05/2023 at 00:23, binaryzero said: You could write some PowerShell to compare the checksum of files in two locations; have it assume that if a file's checksum in Location A (source) matches that of a file in Location B (dest), rename file in Location B to match Location A, else copy file to location B. Already on it! I was Enlisting the help of chat GPT to write me some code. Link to comment https://www.neowin.net/forum/topic/1429506-a-python-script-which-syncs-file-names-between/#findComment-598823302 Share on other sites More sharing options...
+Warwagon MVC Posted May 24, 2023 Author MVC Share Posted May 24, 2023 So nailed out all the bugs and it works great I wanted to do it properly by creating and comparing the hashes of the files but that brought my underpowered file server to its knees and it took forever given the file size. Plus I wanted to be able to do this over the network I ended up having ChatGPT create a Python script that compares the first name of each file and the modification date in folder A (Source) and folder B (Destination). If it gets a match, it renames the file in folder B to the name of the file in folder A. This is because the file names will be all the same except for the year at the end of them It then displays a box, showing me a before and after list of all the files it will be renaming and I have to confirm it. It will also skip files that are already named that name in folder B. I on the first run it doubled up the file extension, so I told it to not do that and then it stopped doing that. Once I click yes Link to comment https://www.neowin.net/forum/topic/1429506-a-python-script-which-syncs-file-names-between/#findComment-598823395 Share on other sites More sharing options...
+Warwagon MVC Posted May 24, 2023 Author MVC Share Posted May 24, 2023 Post no longer needed Link to comment https://www.neowin.net/forum/topic/1429506-a-python-script-which-syncs-file-names-between/#findComment-598823400 Share on other sites More sharing options...
+Warwagon MVC Posted May 24, 2023 Author MVC Share Posted May 24, 2023 So I was trying to tell the program if it finds a file name with the same first word and the same date and time to skip it and move on but record it in a text file. But that made the code overly complicated and it didn't work. so I thought let's have it make me a small collision detector .. the same first word same date AND same time. and ... import os import tkinter as tk from tkinter import filedialog, messagebox from collections import defaultdict def get_first_word(file_name): return file_name.split('.')[0].split(' ')[0] def find_file_collisions(): folder_path = filedialog.askdirectory(title='Select Folder') if not folder_path: return file_info = defaultdict(list) collisions = [] for file_name in os.listdir(folder_path): file_path = os.path.join(folder_path, file_name) if os.path.isfile(file_path): first_word = get_first_word(file_name) modified_time = os.path.getmtime(file_path) file_info[(first_word, modified_time)].append(file_path) for paths in file_info.values(): if len(paths) > 1: collisions.extend(paths) if collisions: messagebox.showinfo("Collisions Found", "Collisions found in the directory.") desktop_path = os.path.join(os.path.expanduser("~"), "Desktop") file_path = os.path.join(desktop_path, "collisions.txt") with open(file_path, 'w') as file: file.write("Duplicate Files:\n") for path in collisions: file.write(f"{os.path.basename(path)} - {path}\n") messagebox.showinfo("Results Saved", f"Duplicate file names and paths recorded in {file_path}.") else: messagebox.showinfo("No Collisions", "No collisions found in the directory.") # Create the main window window = tk.Tk() window.title('File Collision Detector') window.geometry('400x200') # Create the "Find Collisions" button find_button = tk.Button(window, text='Find Collisions', command=find_file_collisions) find_button.pack(pady=20) # Run the main event loop window.mainloop() it worked great I had it scan 1 of my directories it found 2 collisions. 2 files had the same first word in their name and both were modified on 10/27/2017 2:56 pm So cool! Then I got a free program to change the modified date. Link to comment https://www.neowin.net/forum/topic/1429506-a-python-script-which-syncs-file-names-between/#findComment-598823476 Share on other sites More sharing options...
binaryzero Posted May 25, 2023 Share Posted May 25, 2023 Cool. Hopefully one day you learn how to code instead of relying on LLMs... Yonah 1 Share Link to comment https://www.neowin.net/forum/topic/1429506-a-python-script-which-syncs-file-names-between/#findComment-598823584 Share on other sites More sharing options...
+Warwagon MVC Posted May 25, 2023 Author MVC Share Posted May 25, 2023 On 24/05/2023 at 20:46, binaryzero said: Cool. Hopefully one day you learn how to code instead of relying on LLMs... Coding is not for me. I've attempted it many times. But I'm very happy an LLM wrote me some code to solve a problem I was having. The LLM was actually my last resort. I scoured around Google for a program to do what I wanted, but didn't find anything. spikey_richie, Xenon and Yonah 3 Share Link to comment https://www.neowin.net/forum/topic/1429506-a-python-script-which-syncs-file-names-between/#findComment-598823590 Share on other sites More sharing options...
binaryzero Posted May 25, 2023 Share Posted May 25, 2023 Plenty of resources out there to start learning, I actually think you'd enjoy and understand something like PowerShell. You could probably script majority the repetitive stuff I'm sure you do with your business. Dick Montage and Yonah 2 Share Link to comment https://www.neowin.net/forum/topic/1429506-a-python-script-which-syncs-file-names-between/#findComment-598823593 Share on other sites More sharing options...
Jose_49 Posted May 25, 2023 Share Posted May 25, 2023 For massively renaming files I strongly recommend Bulk Rename Utility It's daunting at first. But after you get to know it. It will do wonders with your files! Link to comment https://www.neowin.net/forum/topic/1429506-a-python-script-which-syncs-file-names-between/#findComment-598823628 Share on other sites More sharing options...
+Warwagon MVC Posted May 25, 2023 Author MVC Share Posted May 25, 2023 On 25/05/2023 at 02:19, Jose_49 said: For massively renaming files I strongly recommend Bulk Rename Utility It's daunting at first. But after you get to know it. It will do wonders with your files! Yep, i've used it before. Great tool! Just not for right for This scenario. Jose_49 1 Share Link to comment https://www.neowin.net/forum/topic/1429506-a-python-script-which-syncs-file-names-between/#findComment-598823740 Share on other sites More sharing options...
spikey_richie Posted May 25, 2023 Share Posted May 25, 2023 Doesn't Robocopy have something like this in it's CLI? And iirc Cobian Backup used to support what you're trying to do. Link to comment https://www.neowin.net/forum/topic/1429506-a-python-script-which-syncs-file-names-between/#findComment-598823792 Share on other sites More sharing options...
Brandon H Supervisor Posted May 25, 2023 Supervisor Share Posted May 25, 2023 neat. that's a surprisingly simple code base to achieve what you need there. +Warwagon 1 Share Link to comment https://www.neowin.net/forum/topic/1429506-a-python-script-which-syncs-file-names-between/#findComment-598823798 Share on other sites More sharing options...
+Warwagon MVC Posted May 25, 2023 Author MVC Share Posted May 25, 2023 On 25/05/2023 at 15:18, Brandon H said: neat. that's a surprisingly simple code base to achieve what you need there. Here is how the new version works. First I run a small Collision finder app I had it make for me. This is because I was testing the first app by giving two files the exact same first name and modification date and time. To see what it would do, of course, the program didn't know how to handle it which I expected. I tried to tell it to add code to check for that into the program, but in the end, it was much easier for it to create a separate program I call Collision detector. I actually ran the collision detector on the actual files I made this program for. It found some collisions. Super cool! in 2 of the cases they were duplicate files that could be removed. Gained back 9GB of data finding those. Or if it finds no duplicates it will say Now you can run the primary app After you choose the source and destination it asks you if you want to save it to a text file. if you choose yes, it saves a text file called differences and then exits. Then go look at the text file first to see what it will be renaming. Now once we are satisfied with what it will be renaming, we run the app again and choose no since we already examined the text file we can click yes to rename the files. That's all there is to it! Link to comment https://www.neowin.net/forum/topic/1429506-a-python-script-which-syncs-file-names-between/#findComment-598823809 Share on other sites More sharing options...
+Warwagon MVC Posted May 26, 2023 Author MVC Share Posted May 26, 2023 merged it with the first post Link to comment https://www.neowin.net/forum/topic/1429506-a-python-script-which-syncs-file-names-between/#findComment-598823846 Share on other sites More sharing options...
Nick H. Supervisor Posted May 26, 2023 Supervisor Share Posted May 26, 2023 On 26/05/2023 at 01:54, Warwagon said: Alright, stick a fork in it, it's done I've got to admit, it's pretty cool that you were able to get AI to help you out with this! Link to comment https://www.neowin.net/forum/topic/1429506-a-python-script-which-syncs-file-names-between/#findComment-598823884 Share on other sites More sharing options...
+Warwagon MVC Posted May 26, 2023 Author MVC Share Posted May 26, 2023 Not as anyone cares, but Version 3.1 has been released! 🤣 Link to comment https://www.neowin.net/forum/topic/1429506-a-python-script-which-syncs-file-names-between/#findComment-598823995 Share on other sites More sharing options...
+Warwagon MVC Posted June 5, 2023 Author MVC Share Posted June 5, 2023 Version 3.5.1 is out! Link to comment https://www.neowin.net/forum/topic/1429506-a-python-script-which-syncs-file-names-between/#findComment-598826028 Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now