比较两个目录,然后删除不匹配项 (Python)

Comparing two directories and then removing mismatches (Python)

Whosebug 社区,您好!求救,怎么实现已经脑残了。

例如,有文件夹:'D:\left'和'C:\right'。

它们包含的内容:文件、带文件的目录、子目录、带文件的子目录。大部分内容相同,但'C:\right'中可能有'extra'个内容(与'D:\left'中的内容不匹配)

我如何比较'С:\right'中的内容(内容),'D:\left'中不存在的内容,然后('С:\right'中的额外内容)将其删除,以便文件夹 'D:\left' 和 'C:\right' 变得相同(在我们的例子中,我们不看大小、时间等 - 纯粹看它们内容的名称)。

像这样尝试去除多余的部分:

difs = list(set(os.listdir('C:\right')) - set(os.listdir('D:\left')))

但这还不够,因为它不会将效果传播到子目录。

也喜欢这个:

from dirsync import sync
sync('D:\left', 'C:\right', 'diff')

但是,我只对输出的一小部分感兴趣,具体如何删除这个输出我也不清楚。

删除从 'C:\right' 到从 0 复制到 'D:\left' 到 'C:\right' 的所有内容都不是解决方案。

我很确定解决方案专注于:

os.walk

但我就是不能把它排好:(

非常感谢您的帮助,对于我的愚蠢行为,我深表歉意。

为了清楚起见,我附上了屏幕截图

入口: Entrance Entrance2

运行 程序后的预期结果: Result Result2

您可以使用 Path.rglob:

from pathlib import Path

pl = Path(path/to/left)
pr = Path(path/to/right)

difference = (set(map(lambda p: p.relative_to(pr), pr.rglob('*'))) -
              set(map(lambda p: p.relative_to(pl), pl.rglob('*'))))

这是一个例子:

right
  file1
  file5
  dir1
    file2
    file6
  dir2
    file3
    file7
    subdir1
      file4
      file8
    subdir2
      file9
    subdir3

left
  file1
  dir1
    file2
  dir2
    file3
    subdir1
      file4
>>> difference
{PosixPath('dir1/file6'),
 PosixPath('file5'),
 PosixPath('dir2/subdir3'),
 PosixPath('dir2/subdir2'),
 PosixPath('dir2/subdir1/file8'),
 PosixPath('dir2/subdir2/file9'),
 PosixPath('dir2/file7')}

现在您只需要删除difference中的所有文件和目录。

非常感谢Riccardo Bucco 的回复。我做到了,现在看起来像这样:

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('*')))) # RB genius move

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('\nShift is over, go drink beer')