0

与我的问题相关, 强制 doxygen 从版本化文件中选择一个, 我正在寻找一种非常简单的版本控制,但基于名称。当然,只使用 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")
4

0 回答 0