#!/usr/bin/env python from pathlib import Path from argparse import ArgumentParser from collections import Counter, defaultdict def with_files(path, args): if args.files: return True return path.is_dir() if __name__ == '__main__': parser = ArgumentParser( description='rename folders with case-insensitive names') parser.add_argument('startfolder', help='where to start') parser.add_argument('--with_files', '-w', action='store_true', help='rename files, too') args = parser.parse_args() # recursively get and sort paths by length folders = sorted([path for path in Path(args.startfolder).rglob('*') if with_files(path, args)], key=lambda x: len(x.parts), reverse=True) foldernames = {str(folder): str(folder).lower() for folder in folders} counter = Counter(foldernames.values()) duplicate_folders = [item for item in counter if counter[item] > 1] count_folders = defaultdict(lambda: 1) # counters / folder start with 1 rename_folders = [] for duplicate_folder in duplicate_folders: names = sorted([key for key, value in foldernames.items() if value == duplicate_folder])[1:] for name in names: rename_folders.append( (name, (name, count_folders[duplicate_folder]))) count_folders[duplicate_folder] += 1 for old, new in rename_folders: old = Path(old) newname, newcounter = new while newpath := Path('%s_%04d'%(newname, newcounter)): if not newpath.exists(): break newcounter += 1 old.rename(newpath)