复制目录树但使用最新文件?

时间:2017-05-24 00:39:35

标签: python backup version copytree

与我的问题相关 force doxygen to pick one from versioned files 我正在寻找一种非常简单的版本控制,但是基于名称。可以肯定的是,使用vcs会更容易,但我也想在二进制文件上使用它(每个文件大约1GB)。我只是想备份最后一个版本。

最后,我正在寻找为后续目录树创建副本的东西

rootDir
    -filename1
    -filename2
    -justName
    -otherName
    -dirA
        -dirAFile_ver01
        -dirAFile_ver02
    -dirB
        -dirBFile_01
        -dirBFile_02
        -dirBFile1
        -dirBFile2
    -dirC
        -dirCFile01
        -dirCFile02
        -dirD
            -dirDFile-01
            -dirDFile-02
            -dirDFile.0.1
            -dirDFile.0.2
            -dirDFile.1
    -dirE
        -file1.jpg
        -file2.jpg
        -file1.txt
        -file2.txt

并且输出应该如下所示

COPY_rootDir
    -filename2
    -justName
    -otherName
    -dirA
        -dirAFile_ver02
    -dirB
        -dirBFile_02
        -dirBFile2
    -dirC
        -dirCFile02
        -dirD
            -dirDFile-02
            -dirDFile.1
    -dirE
        -file2.jpg
        -file2.txt

是否有任何可以使用的模块可以帮助我?我甚至不知道如何定义这种版本控制方法。也许有准备使用工具? 我在python中编写了一个简单的脚本,用最新的文件(按名称)创建目录树的副本,但它并不完美,需要考虑很多例外,很多版本化命名约定的可能性。 当前的python脚本看起来像这样

import os, shutil
#------
#[return list of words splitted by list of characters]
def multisplit( splitStr , splitList ):
    for splitChar in splitList:
        splitStr = splitStr.replace( splitChar , " " )
    return splitStr.split()   
#------
#[first split by multisplit and then remove any number from string ]
def dualSplit( splitStr, splitList):
    firstPass = multisplit(splitStr,splitList)[0]
    secondPass = ''.join([char for char in firstPass if not char.isdigit()])
    return secondPass
#------
#be sure to use proper slashes]
def ensureSlashes( directoryPath ):
    strList = multisplit( directoryPath , ["\\", "/"] )
    return os.sep.join( strList )
#------
#[copy dirtree with latest files]
def copyLastVersions( source , destination ):
    source = ensureSlashes(source)
    sourcelen = len(source.split(os.sep))
    destination = ensureSlashes(destination)
    for root, dirs, files in os.walk(source):
        similar = []
        for file in sorted(files):
            if file not in similar:
                fname, fext = file.rsplit( "." , 1 )
                fnameOnly = dualSplit( fname , ['_', '-', '.'] )
                similar = [fn for fn in sorted(files)   if  (fnameOnly in fn)   \
                                                        and (fext in fn)        \
                                                        and (len(fnameOnly) == len(dualSplit( fn , ['_', '-', '.']))) ]
                sourceFile = os.sep.join([root, similar[-1]])
                depth =  len(root.split(os.sep)) - sourcelen
                destinationFile = os.sep.join(sourceFile.split(os.sep)[-depth-1:])
                #LOG
                """
                print "--"
                print file, " -- ", fnameOnly
                print similar
                print similar[-1]
                print "source-- ", sourceFile
                print "destin-- ", destinationFile
                print "--------------"
                """
                outPath = os.sep.join([destination,destinationFile])
                print outPath
                if not os.path.exists(os.path.dirname(outPath)):
                    os.mkdir(os.path.dirname(outPath))
                shutil.copy2(sourceFile ,outPath )

copyLastVersions( r"ROOT_SOURCE_PATH" , r"ROOT_DESTINATION_PATH")

0 个答案:

没有答案