我的硬盘往往被旧文件堵塞,我想用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)
答案 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))