与我的问题相关 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")