如何跳过子文件夹中的现有文件并仅复制新文件

时间:2016-03-14 05:45:18

标签: python directory copy shutil

我是使用shutil copytree

复制文件夹和主文件夹内的所有子文件夹
import shutil
import sys
import os
import re

SOURCE_FOLDER = sys.argv[1]
DESTINATION_FOLDER = sys.argv[2]


def copyDirectory(SOURCE_FOLDER, DESTINATION_FOLDER):
    try:
        print SOURCE_FOLDER
        print DESTINATION_FOLDER
        shutil.copytree(SOURCE_FOLDER, DESTINATION_FOLDER)
    # Directories are the same
    #except:
    #   print "Not copied"
    except shutil.Error as e:
        print('Directory not copied. Error: %s' % e)
    # Any error saying that the directory doesn't exist
    except OSError as e:
        print('Directory not copied. Error: %s' % e)

copyDirectory(SOURCE_FOLDER,DESTINATION_FOLDER)

问题是如果目录存在则抛出错误

Directory not copied. Error: [Errno 17] File exists: 'destination'

我想要的是,如果目录已经存在,它想要检查所有子目录,如果子目录也存在,它应该检查其中的所有文件,它应该跳过现有文件并复制该子目录中的新文件,如果sub direscotry不存在,那么它应该复制该子目录

注意:子目录可能是嵌套的(子目录的子目录)。

但是上面的脚本无法正常工作我应该添加到该脚本中吗?

2 个答案:

答案 0 :(得分:1)

不写

shutil.copytree来跳过现有的目标文件和目录。来自文档

  

目标目录必须不存在。

您需要编写自己的解决方案。现有的copytree代码是一个良好的开端。

答案 1 :(得分:0)

为了检查目录是否已存在,您可以使用:os.path.exists(directory)

if not os.path.exists(DESTINATION_FOLDER):
    shutil.copytree(SOURCE_FOLDER, DESTINATION_FOLDER)

如果dest目录已经存在,您可以在src-dir的子目录上运行您的函数。 您可以使用以下函数获取所有src-dir子目录的列表,该函数将目录名称作为输入,并返回子目录列表

def SubDirPath (d):
    return filter(os.path.isdir, [os.path.join(d,f) for f in os.listdir(d)])

使用这个目录列表,您可以在目录的每个实例上再次执行您的功能。

对于src和dst中存在的每个目录 - 如果文件也存在于dst-dir中,则需要检查src-dir中的每个文件。

最诚挚的问候,

亚龙