比较目录,删除剩余文件,复制新文件

时间:2014-03-18 23:50:30

标签: python python-3.x filesystems

我的硬盘往往被旧文件堵塞,我想用Python来清理它们。我正在尝试创建一个查看两个目录的脚本,删除源目录中找不到的任何文件,然后将所有新文件从所述源复制到目标。

到目前为止,我只能让它在任何目录的第一级工作。换句话说,它似乎不扫描旧文件的任何子目录。我一直试图找到一种方法来通过os.walk和filecmp模块递归查看subs,但还没有解决问题。

这是我到目前为止所拥有的:

import os
import filecmp

def delete_diffs(src, dst):
    dirs = filecmp.dircmp(src, dst)
    for items in dirs.right_only:
        if os.path.isdir(dst + '\\' + items) == True:
           print('Removing ' + items)
           os.system("""rmdir "{0}" /S /Q """.format(os.path.join(dst, items)))
        if os.path.isdir(dst + '\\' + items) == False:
           print('Removing ' + items)
           os.remove(dst + '\\' + items)

1 个答案:

答案 0 :(得分:0)

使用shutil复制或删除整个目录或复制具有(大多数)属性的文件。 os.path.relpath可以与os.walk一起使用,如下所示,遍历一个目录并使用相同的相对路径与另一个目录进行比较。以下适用于我:

import os, filecmp, shutil

def resolve_diffs(src, dst):
    for src_root, src_dirs, src_files in os.walk(src, topdown=True):
        dst_root = os.path.join(dst, os.path.relpath(src_root, src))
        dirs = filecmp.dircmp(src_root, dst_root)
        for item in dirs.right_only:
            print('Removing ' + item)
            dst_path = os.path.join(dst_root, item)
            if os.path.isdir(dst_path):
                shutil.rmtree(dst_path)
            else:
                os.remove(dst_path)
        for item in dirs.left_only:
            print('Adding ' + item)
            src_path = os.path.join(src_root, item)
            if os.path.isdir(src_path):
                shutil.copytree(src_path, os.path.join(dst_root, item))
            else:
                shutil.copy2(src_path, os.path.join(dst_root, item))