Сразу скажу, я исхожу из того, что целевые каталоги находятся НЕ там же, где исходные. Иначе программа усложняется раз в пять.
Пишем алгоритм.
1. Для каждого каталога:
2. Для каждого файла в каталоге:
3. Определяем каталог, куда этот файл дожен быть перемещён.
4. Проверяем, есть ли в каталоге файл с таким именем.
5. Если есть, то добавляем к исходному имени суффикс (i). Увеличиваем i, пока не найдём незанятое имя.
6. Определив имя, переносим/копируем файл в целевой каталог.
Перенести это на питоне не будет сложно, модуль pathlib очень удобен для таких манипуляций. Максимум, написать небольшую функцию для реализации п. 5.
def find_unused_name(dir: pathlib.Path, basename: str) -> str:
... # тут реализуем пункт 5, и возвращаем имя с правильным суффиксом.