Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 复制目录树,但使用最新文件?_Python_Backup_Version_Copytree - Fatal编程技术网

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

Python 复制目录树,但使用最新文件?,python,backup,version,copytree,Python,Backup,Version,Copytree,关于我这里的问题 我正在寻找一种非常简单的版本控制,但基于名称。当然,只使用vcs会更容易,但我也想在二进制文件上使用它(每个文件大约1gb)。我只想备份上一个版本 最后,我正在寻找一些为下面的目录树创建副本的东西 rootDir -filename1 -filename2 -justName -otherName -dirA -dirAFile_ver01 -dirAFile_ver02 -dirB

关于我这里的问题 我正在寻找一种非常简单的版本控制,但基于名称。当然,只使用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脚本如下所示

COPY_rootDir
    -filename2
    -justName
    -otherName
    -dirA
        -dirAFile_ver02
    -dirB
        -dirBFile_02
        -dirBFile2
    -dirC
        -dirCFile02
        -dirD
            -dirDFile-02
            -dirDFile.1
    -dirE
        -file2.jpg
        -file2.txt
导入操作系统,shutil
#------
#[返回按字符列表拆分的单词列表]
def Multiplit(拆分字符串、拆分列表):
对于splitList中的splitChar:
splitStr=splitStr.replace(splitChar,“”)
返回splitStr.split()
#------
#[首先按Multiplit分割,然后从字符串中删除任何数字]
def dualSplit(splitStr,splitList):
firstPass=multiplit(splitStr,splitList)[0]
secondPass=''.join([char for char in firstPass if not char.isdigit()]))
返回第二通行证
#------
#确保使用正确的斜杠]
def确保刷新(目录路径):
strList=multiplit(directoryPath,[“\\”,“/”)
返回操作系统9月加入(strList)
#------
#[使用最新文件复制目录树]
def copyLastVersions(源、目标):
source=确保刷新(source)
sourcelen=len(source.split(os.sep))
目的地=确保刷新(目的地)
对于os.walk(源)中的根目录、目录和文件:
相似=[]
对于已排序的文件(文件):
如果文件格式不相似:
fname,fext=file.rsplit(“.”,1)
fnameOnly=dualSplit(fname,[''''.','-','.'.]]
相似=[fn表示已排序(文件)中的fn如果(fnameOnly in fn)\
和(fn中的fext)\
和(len(fnameOnly)==len(双分裂(fn,[''''''.'-','.]]))
sourceFile=os.sep.join([root,类似[-1]])
深度=len(root.split(os.sep))-sourcelen
destinationFile=os.sep.join(sourceFile.split(os.sep)[-depth-1:]
#日志
"""
打印“-”
仅打印文件“--”,fName
打印相似的
打印类似的[-1]
打印“源--”,源文件
打印“destin--”,destinationFile
打印“------------”
"""
outPath=os.sep.join([destination,destinationFile])
打印输出路径
如果不存在os.path.exists(os.path.dirname(outPath)):
os.mkdir(os.path.dirname(outPath))
copy2(源文件,输出路径)
copyLastVersions(r“根\源\路径”,r“根\目标\路径”)

我建议您使用每个文件的最后修改日期来选择最新的文件。看见正如您所发现的,解析文件名充其量是非常容易出错的。顺便说一句,许多VCS系统都支持二进制文件。谢谢@martineau,我会在末尾添加修改时间检查,但可以肯定的是,在一开始我需要检查由类似名称组成的文件组,例如
[filename1 filename2]
(然后在检查创建日期之前选择filename2)。我更感兴趣的是一些可以帮助我按名称对文件进行分组的东西,例如
[filename1,filename2,filename3]
,一些可以找到文件名模式的东西,例如
[filename1\u 01,filename1\u 02,filename1\u 03]
,并检查filename1\u 03是否是最新的。请记住,
filename1\u 01
filename\u 01
filename.1
是3个不同的文件,filename.jpg filename.ma