Python中的备份脚本

2 投票
1 回答
1677 浏览
提问于 2025-04-16 11:17

有人能给我解释一下这段代码吗?特别是关于maxversions的用法,以及在“for f in files:”这行之后的语句。

我想知道xrange(MAXVERSION)是什么意思?索引的用法是什么?

for index in xrange(MAXVERSIONS): backup = '%s.%2.2d' % (destpath, index) 

代码如下:

!/usr/bin/env python

import sys,os, shutil, filecmp

MAXVERSIONS=100
BAKFOLDER = '.bak'

def backup_files(tree_top, bakdir_name=BAKFOLDER):

     top_dir = os.path.basename(tree_top)
    tree_top += os.sep

    for dir, subdirs, files in os.walk(tree_top):

        if os.path.isabs(bakdir_name):
            relpath = dir.replace(tree_top,'')
            backup_dir = os.path.join(bakdir_name, top_dir, relpath)
        else:
            backup_dir = os.path.join(dir, bakdir_name)

        if not os.path.exists(backup_dir):
            os.makedirs(backup_dir)

            subdirs[:] = [d for d in subdirs if d != bakdir_name]
        for f in files:
            filepath = os.path.join(dir, f)
            destpath = os.path.join(backup_dir, f)
                for index in xrange(MAXVERSIONS):
                backup = '%s.%2.2d' % (destpath, index)
                abspath = os.path.abspath(filepath)

                if index > 0:

                    old_backup = '%s.%2.2d' % (destpath, index-1)
                    if not os.path.exists(old_backup): break
                    abspath = os.path.abspath(old_backup)

                    try:
                        if os.path.isfile(abspath) and filecmp.cmp(abspath, filepath, shallow=False):
                            continue
                    except OSError:
                        pass

                try:
                    if not os.path.exists(backup):
                        print 'Copying %s to %s...' % (filepath, backup)
                        shutil.copy(filepath, backup)
                except (OSError, IOError), e:
                    pass

if __name__=="__main__":
    if len(sys.argv)<2:
        sys.exit("Usage: %s [directory] [backup directory]" % sys.argv[0])

    tree_top = os.path.abspath(os.path.expanduser(os.path.expandvars(sys.argv[1])))

    if len(sys.argv)>=3:
        bakfolder = os.path.abspath(os.path.expanduser(os.path.expandvars(sys.argv[2])))
    else:
        bakfolder = BAKFOLDER

    if os.path.isdir(tree_top):
        backup_files(tree_top, bakfolder)

1 个回答

3

这个脚本的作用是把一个文件夹里的内容(默认是当前文件夹)递归地复制到一个备份文件夹(默认是当前文件夹下的.bak文件夹);

对于每个文件名,比如filename.ext,它会创建一个副本,命名为filename.ext.00;如果filename.ext.00已经存在了,它就会创建filename.ext.01,以此类推。

xrange()是一个生成器,它会返回从0到(MAXVERSION-1)之间的所有数字,所以MAXVERSION控制了要尝试多少个版本后缀,也就是要保留多少个旧版本的文件。

撰写回答