代码来自网络,我进行了一些注释与修改

要个点赞关注没问题吧

程序功能与用法:
指定源文件夹与目标文件夹,自动检测自上次备份以来源文件夹中内容的改变,
包括修改的文件、新建的文件、新建的文件夹等等,自动复制新增或修改过的文件到目标文件夹中,
自上次备份以来没有修改过的文件将被忽略而不复制,从而实现增量备份。

import os
import filecmp
import shutil
import sys


def usage():
    print("scrDir and dstDir must be existing absolute path of certain directory")
    print("For example:{0} c:\\olddir c:\\newdir".format(sys.argv[0]))
    # sys.argv  返回当前工作文件路径
    sys.exit(0) #正常退出

def autoBackup(scrDir, dstDir):
    if ((not os.path.isdir(scrDir)) or (not os.path.isdir(dstDir))  or\
        (os.path.abspath(scrDir) != scrDir) or (os.path.abspath(dstDir) != dstDir)):
        #如果所给两个路径是否为文件夹,并且所给路径和绝对路径相同
        #os.path.isdir(path) 判断path是否为文件夹
        #os.path.abspath(path) 返回path的绝对路径
        usage() #那就输出错误提示
        
    for item in os.listdir(scrDir): #开始对源文件夹进行遍历
        #os.path.listdir(path)  返回path目录下的文件和目录列表
        scrItem = os.path.join(scrDir, item) #scrtem为scrDir的下一级目录
        #os.path.join(path, *path) 连接两个或多个path
        dstItem = scrItem.replace(scrDir, dstDir) # dstTItem为备份文件夹下与scrItem相同的目录

        if os.path.isdir(scrItem): #如果srcItem是文件夹
            if not os.path.exists(dstItem): #如果备份文件夹里没有这个文件夹
                # os.path.exists(path) 判断文件是否存在
                os.makedirs(dstItem) #那就在备份文件夹里创建它
                #os.makedirs(path)递归创建文件夹目录path
                print("make directory" + dstItem) #输出说创建了一个文件夹目录
            autoBackup(scrItem, dstItem) #因为所创建备份文件夹目录为空,所以需要递归返回函数继续遍历源文件夹,继续备份

        elif os.path.isfile(scrItem): #如果scrItem是文件
            # os.path.isfile(path) 判断path是否为文件
            if ((not os.path.exists(dstItem)) or\
                (not filecmp.cmp(scrItem, dstItem, shallow=True))):
                #如果备份文件夹里没有这个文件,或这个文件与上次备份相比被修改过
                #filecmp.cmp(f1,f2,[shallow]) 比较f1和f2文件内容是否相等,可选参数shallow定义是否考虑文件本身的属性
                shutil.copyfile(scrItem, dstItem) #备份文件
                #shutil.copyfile(f1,f2) 将f1的文件拷贝到f2
                print("file:" + scrItem + "==>" + dstItem) #输出文件备份的提示

# if __name__ == "__main__":
#     if (len(sys.argv) != 3):
#         usage()
#     scrDir, dstDir = sys.argv[1], sys.argv[2]
#     autoBackup(scrDir, dstDir)
path1 = input("请输入源文件路径:")
path2 = input("请输入目标文件路径:")
autoBackup(path1,path2)

2、在上述1程序的基础上,统计备份后的文件总大小、文件总数量、目录总数量

import os
import filecmp
import shutil
import sys

totalSize = 0
fileNum = 0
dirNum = 0

def usage():
    print("scrDir and dstDir must be existing absolute path of certain directory")
    print("For example:{0} c:\\olddir c:\\newdir".format(sys.argv[0]))
    # sys.argv  返回当前工作文件路径
    sys.exit(0) #正常退出


def autoBackup(scrDir, dstDir):

    if ((not os.path.isdir(scrDir)) or (not os.path.isdir(dstDir))  or\
        (os.path.abspath(scrDir) != scrDir) or (os.path.abspath(dstDir) != dstDir)):
        #如果所给两个路径是否为文件夹,并且所给路径和绝对路径相同
        #os.path.isdir(path) 判断path是否为文件夹
        #os.path.abspath(path) 返回path的绝对路径
        usage() #那就输出错误提示

    for item in os.listdir(scrDir): #开始对源文件夹进行遍历
        #os.path.listdir(path)  返回path目录下的文件和目录列表
        scrItem = os.path.join(scrDir, item) #scrtem为scrDir的下一级目录
        #os.path.join(path, *path) 连接两个或多个path
        dstItem = scrItem.replace(scrDir, dstDir) # dstTItem为备份文件夹下与scrItem相同的目录

        if os.path.isdir(scrItem): #如果srcItem是文件夹
            if not os.path.exists(dstItem): #如果备份文件夹里没有这个文件夹
                # os.path.exists(path) 判断文件是否存在
                os.makedirs(dstItem) #那就在备份文件夹里创建它
                #os.makedirs(path)递归创建文件夹目录path
                print("make directory" + dstItem) #输出说创建了一个文件夹目录
            autoBackup(scrItem, dstItem) #因为所创建备份文件夹目录为空,所以需要递归返回函数继续遍历源文件夹,继续备份

        elif os.path.isfile(scrItem): #如果scrItem是文件
            # os.path.isfile(path) 判断path是否为文件
            if ((not os.path.exists(dstItem)) or\
                (not filecmp.cmp(scrItem, dstItem, shallow=True))):
                #如果备份文件夹里没有这个文件,或这个文件与上次备份相比被修改过
                #filecmp.cmp(f1,f2,[shallow]) 比较f1和f2文件内容是否相等,可选参数shallow定义是否考虑文件本身的属性
                shutil.copyfile(scrItem, dstItem) #备份文件
                #shutil.copyfile(f1,f2) 将f1的文件拷贝到f2
                print("file:" + scrItem + "==>" + dstItem) #输出文件备份的提示

def visitDir(path):
    global totalSize # 总文件大小
    global fileNum #文件数量
    global dirNum #文件夹数量

    for lists in os.listdir(path):
        sub_path = os.path.join(path, lists)
        if os.path.isfile(sub_path):
            fileNum = fileNum + 1
            totalSize = totalSize + os.path.getsize(sub_path)
            #os.path.getsize(path) 返回path文件的大小
        elif os.path.isdir(sub_path):
            dirNum = dirNum + 1
            visitDir(sub_path)

def sizeConvert(size): #单位换算
    K, M, G = 1024, 1024**2, 1024**3
    if size >= G:
        x = str(size / G) + "G Bytes"
    elif size >= M:
        x = str(size / M) + "M Bytes"
    elif size >= K:
        x = str(size / K) + "K Bytes"
    else :
        x = str(size) + 'Bytes'
    return x

def output(path):
    visitDir(path2)
    print("The total size of " + path + "is: " \
          + sizeConvert(totalSize) + "(" + str(totalSize) + "Bytes)")
    print("The total number of files in " + path + " is: ", fileNum)
    print("The total number of directories in " + path + " is: ", dirNum)

path1 = input("请输入源文件路径:")
path2 = input("请输入目标文件路径:")
autoBackup(path1,path2)
output(path2)

3、在上述2程序的基础上,统计本次备份的文件总大小、文件总数量、目录总数量

import os
import filecmp
import shutil
import sys

totalSize = 0
fileNum = 0
dirNum = 0

ThisTotalSize = 0
ThisFileNum = 0
ThisDirNum = 0

def usage():
    print("scrDir and dstDir must be existing absolute path of certain directory")
    print("For example:{0} c:\\oldDir c:\\newDir".format(sys.argv[0]))
    # sys.argv  返回当前工作文件路径
    sys.exit(0) #正常退出


def autoBackup(scrDir, dstDir):

    global ThisTotalSize
    global ThisFileNum
    global ThisDirNum

    if ((not os.path.isdir(scrDir)) or (not os.path.isdir(dstDir))  or\
        (os.path.abspath(scrDir) != scrDir) or (os.path.abspath(dstDir) != dstDir)):
        #如果所给两个路径是否为文件夹,并且所给路径和绝对路径相同
        #os.path.isdir(path) 判断path是否为文件夹
        #os.path.abspath(path) 返回path的绝对路径
        usage() #那就输出错误提示

    for item in os.listdir(scrDir): #开始对源文件夹进行遍历
        #os.path.listdir(path)  返回path目录下的文件和目录列表
        scrItem = os.path.join(scrDir, item) #scrtem为scrDir的下一级目录
        #os.path.join(path, *path) 连接两个或多个path
        dstItem = scrItem.replace(scrDir, dstDir) # dstTItem为备份文件夹下与scrItem相同的目录

        if os.path.isdir(scrItem): #如果srcItem是文件夹
            if not os.path.exists(dstItem): #如果备份文件夹里没有这个文件夹
                # os.path.exists(path) 判断文件是否存在
                os.makedirs(dstItem) #那就在备份文件夹里创建它
                ThisDirNum += 1
                #os.makedirs(path)递归创建文件夹目录path
                print("make directory" + dstItem) #输出说创建了一个文件夹目录
            autoBackup(scrItem, dstItem) #因为所创建备份文件夹目录为空,所以需要递归返回函数继续遍历源文件夹,继续备份

        elif os.path.isfile(scrItem): #如果scrItem是文件
            # os.path.isfile(path) 判断path是否为文件
            if ((not os.path.exists(dstItem)) or\
                (not filecmp.cmp(scrItem, dstItem, shallow=True))):
                #如果备份文件夹里没有这个文件,或这个文件与上次备份相比被修改过
                #filecmp.cmp(f1,f2,[shallow]) 比较f1和f2文件内容是否相等,可选参数shallow定义是否考虑文件本身的属性
                shutil.copyfile(scrItem, dstItem) #备份文件
                ThisFileNum += 1
                ThisTotalSize += os.path.getsize(dstItem)
                #shutil.copyfile(f1,f2) 将f1的文件拷贝到f2
                print("file:" + scrItem + "==>" + dstItem) #输出文件备份的提示

def visitDir(path):
    global totalSize # 总文件大小
    global fileNum #文件数量
    global dirNum #文件夹数量

    for lists in os.listdir(path):
        sub_path = os.path.join(path, lists)
        if os.path.isfile(sub_path):
            fileNum = fileNum + 1
            totalSize = totalSize + os.path.getsize(sub_path)
            #os.path.getsize(path) 返回path文件的大小
        elif os.path.isdir(sub_path):
            dirNum = dirNum + 1
            visitDir(sub_path)

def sizeConvert(size): #单位换算
    K, M, G = 1024, 1024**2, 1024**3
    if size >= G:
        x = str(size / G) + "G Bytes"
    elif size >= M:
        x = str(size / M) + "M Bytes"
    elif size >= K:
        x = str(size / K) + "K Bytes"
    else :
        x = str(size) + 'Bytes'
    return x

def output(path):
    visitDir(path2)
    print("The this time backup files size is: " \
          + sizeConvert(ThisTotalSize) + "(" + str(ThisTotalSize) + "Bytes)")
    print("The this time backup files is: ", ThisFileNum)
    print("The this time backup directories is: ",ThisDirNum)
    print("The total size of " + path + "is: " \
          + sizeConvert(totalSize) + "(" + str(totalSize) + "Bytes)")
    print("The total number of files in " + path + " is: ", fileNum)
    print("The total number of directories in " + path + " is: ", dirNum)


path1 = input("请输入源文件路径:")
path2 = input("请输入目标文件路径:")
autoBackup(path1,path2)
output(path2)

4、在上述123程序基础上,对每个文件生产MD5验证文件,存储在一个对应的MD5目录体系

 

5、在上述4程序基础上,对md5验证码一致的文件,另外建立一个单独目录存储,从原文件目录删除该文件,在该处保存文件链接

6、在上述程序基础上,每个目录下检查backup.sh或backup.cmd,调用操作系统命令在备份之前先进行其他内容备份

7、编程对一个目录及其子目录下的py文件计算总行数和不是空行的行数,并按照完整目录
名称进行打印显示
(总行数、非空行数、目录名称)

import os

def Traverse_file(dir):
    for i in os.listdir(dir):
        path = os.path.join(dir,i)
        if os.path.isfile(path) and path[-3:] == '.py':
            with open(path,'r',encoding="utf-8") as py:
                l = py.readlines()
                n = 0
                for j in l:
                    if j.split() != []:
                        n += 1
                print("%d\t  %d\t  %s\n" % (len(l), n, path))
        elif os.path.isdir(path):
            Traverse_file(path)

path = input("请输入所需检索文件目录:")
print("总行数","非空行数","目录名称")
Traverse_file(path)

未完待续。。。