Сравнение двух директорий с последующим удалением несовпадений (Python)
Приветствую сообщество ru.stackoverflow! Помогите, уже изломал себе голову как реализовать.
Есть, например папки: 'D:\лево' и 'С:\право'.
В них содержимое: файлы, директории с файлами, поддиректории, поддиректории с файлами. Большая часть содержимого одинаковая, однако в 'С:\право' может быть 'лишнее' содержимое (не совпадающая с содержимым 'D:\лево').
Как можно сравнить содержимое (что есть в) 'С:\право', чего нет в 'D:\лево' и после это (лишнее в 'С:\право') удалить, чтобы папки 'D:\лево' и 'С:\право' стали идентичны (в нашем случае не смотрим на размер, время и т.д - чисто по именам их содержимого).
Пробовал вот так для выведение лишнего:
diferent = list(set(os.path.join(right, f) - set(os.path.join(left, f)))
Но этого мало, ведь оно не распространяет эффект на поддиректории.
Еще вот так:
from dirsync import sync
sync(left, right, 'diff')
Но, там меня интересует только 1/3 от вывода и как именно пустить этот вывод под удаление для меня дремучий лес.
Удалять все с 'С:\право', чтобы перекопировать с 0-ля 'D:\лево' в 'С:\право' - это не решение.
Я уверен, что решение зациклено на
os.walk
Но хоть убейте никак не могу выстроить верно
Большое спасибо заранее за любую помощь и прошу прощение за глупость.
Прикрепляю скриншоты:
Вход:
Видим так же:
Желаемый результат после выполнения программы:

Ответы (1 шт):
Большое спасибо 'Riccardo Bucco' c stackoverflow.com за его ответ. С его помощью все удалось как нельзя лучше:
from pathlib import Path
import shutil
import os
pl = Path(left_way) # left_way = r'D:\left' = 'D:\\left'
pr = Path(right_way)
difference = (set(map(lambda p: p.relative_to(pr), pr.rglob('*'))) - set(
map(lambda p: p.relative_to(pl), pl.rglob('*')))) # pathlib сила!
if len(difference) > 0:
print('\nContent to be deleted:\n')
for a in difference:
a2 = Path(pr, a)
print(' ', a2)
while True:
copyornot = input('\nDelete? (Y/n):\n')
if copyornot == 'Y':
break
elif copyornot == 'n':
print('...')
continue
else:
print('(Y/n)')
for a in difference:
a2 = Path(pr, a)
if os.path.isfile(a2):
os.remove(a2)
if os.path.isdir(a2):
shutil.rmtree(a2)
print('\nFinish')



