Python学习笔记-校验源与备份目录差异

简介:

校验源与备份目录差异

    有时我们无法确认备份与源目录文件是否保持一致,包括源目录中的新文件或目录、更新文件或目录有无成功同步,定期进行校验,没有成功则希望有针对性地进行补备份。

本例使用了filecmp模块的left_only、diff_files方法递归获取源目录的更新项,再通过shutil.copyfile、os.makedirs方法对更新项进行复制,最终保持一致状态。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/python3
#
import  os
import  sys
import  filecmp
import  re
import  shutil
holderlist = []
 
def  compareme(dir1,dir2):    #递归获取更新项函数
     dircomp  =  filecmp.dircmp(dir1,dir2)
     only_in_one  =  dircomp.left_only      #源目录新文件或目录
     diff_in_one  =  dircomp.diff_files     #不匹配文件,源目录文件已经发生变化
     dirpath  =  os.path.abspath(dir1)      #定义源目录绝对路径
     [holderlist.append(os.path.abspath(os.path.join(dir1,x)))  for  in  only_in_one]
     [holderlist.append(os.path.abspath(os.path.join(dir1,x)))  for  in  diff_in_one]
 
     if  len (dircomp.common_dirs) >  0 :     #判断是否存在相同子目录,以便递归
         for  item  in  dircomp.common_dirs:     #递归子目录
             compareme(os.path.abspath(os.path.join(dir1,item)), os.path.abspath(os.path.join(dir2,item)))
     return  holderlist
def  checkargv():
     if  len (sys.argv) <  2 :    #要求输入源目录与备份目录
         print  ( "Usage: " , sys.argv[ 0 ],  "datadir backupdir" )
         sys.exit()
     else :
         dir1  =  sys.argv[ 1 ]
         dir2  =  sys.argv[ 2 ]
         source_files  =  compareme(dir1,dir2)      #对比源目录与备份目录
         dir1  =  os.path.abspath(dir1)
 
         if  not  dir2.endswith( '/' ):       #备份目录路径加“/”符
             dir2  =  dir2 + '/'     
         dir2  =  os.path.abspath(dir2)
         destination_files  =  []
         createdir_bool  =  False
 
         for  item  in  source_files:    #遍历返回的差异文件或目录清单
             destination_dir  =  re.sub(dir1,dir2,item)     #将源目录差异路径清单对应替换成备份目录
             destination_files.append(destination_dir)  
             if  os.path.isdir(item):      #如果差异路径为目录且不存在,则再备份目录中创建
                 if  not  os.path.exists(destination_dir):
                     os.makedirs(destination_dir)
                     createdir_bool  =  True    #再次调用compareme函数标记
 
         if  createdir_bool:       #重新调用compareme函数,重新遍历新创建目录的内容
             destination_files  =  []
             source_files  =  []
             source_files  =  compareme(dir1,dir2)      #调用compareme函数
             for  item  in  source_files:    #获取源目录差异路径清单,对应替换成备份目录
                 destination_dir  =  re.sub(dir1,dir2,item)
                 destination_files.append(destination_dir)
 
         print  ( "update item: " )
         print  (source_files)     #输出更新项列表清单
         copy_pair  =  zip (source_files,destination_files)      #讲源目录与备份目录文件清单拆分成元组
         for  item  in  copy_pair:
             if  os.path.isfile(item[ 0 ]):      #判断是否为文件,是则进行复制操作
                 shutil.copyfile(item[ 0 ], item[ 1 ])
 
if  __name__  = =  '__main__' :
     checkargv()


执行前:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@kurol pkg1] # tree -d test1 test2
test1
| - -  test11
| - -  test12
| - -  test13
| - -  test17
| - -  test99
` - -  testmmmm13
test2
| - -  test11
| - -  test12
| - -  test13
| - -  test14
` - -  test17
 
11  directories


执行:

1
2
3
[root@kurol pkg1] # python3 checkdir2.py test1 test2
update item: 
[ '/opt/python361/pkg1/test1/test99' '/opt/python361/pkg1/test1/testmmmm13' ]


执行后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@kurol pkg1] # tree -d test1 test2
test1
| - -  test11
| - -  test12
| - -  test13
| - -  test17
| - -  test99
` - -  testmmmm13
test2
| - -  test11
| - -  test12
| - -  test13
| - -  test14
| - -  test17
| - -  test99
` - -  testmmmm13
 
13  directories






      本文转自谢育政 51CTO博客,原文链接:http://blog.51cto.com/kurolz/1935047 ,如需转载请自行联系原作者


相关文章
|
2月前
|
网络协议 Java Linux
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
本文介绍了PyAV库,它是FFmpeg的Python绑定,提供了底层库的全部功能和控制。文章详细讲解了PyAV的安装过程,包括在Windows、Linux和ARM平台上的安装步骤,以及安装中可能遇到的错误和解决方法。此外,还解释了时间戳的概念,包括RTP、NTP、PTS和DTS,并提供了Python代码示例,展示如何获取RTSP流中的各种时间戳。最后,文章还提供了一些附录,包括Python通过NTP同步获取时间的方法和使用PyAV访问网络视频流的技巧。
420 4
PyAV学习笔记(一):PyAV简介、安装、基础操作、python获取RTSP(海康)的各种时间戳(rtp、dts、pts)
|
2月前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
164 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
2月前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
173 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
2月前
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
73 1
|
2月前
|
Ubuntu Linux Python
Ubuntu学习笔记(六):ubuntu切换Anaconda和系统自带Python
本文介绍了在Ubuntu系统中切换Anaconda和系统自带Python的方法。方法1涉及编辑~/.bashrc和/etc/profile文件,更新Anaconda的路径。方法2提供了详细的步骤指导,帮助用户在Anaconda和系统自带Python之间进行切换。
112 1
|
2月前
|
Python
Python实用记录(四):os模块-去后缀或者改后缀/指定目录下图片或者子目录图片写入txt/csv
本文介绍了如何使用Python的os模块来操作文件,包括更改文件后缀、分割文件路径和后缀、将指定目录下的所有图片写入txt文档,以及将指定目录下所有子目录中的图片写入csv文档,并为每个子目录分配一个标签。
27 1
|
2月前
|
编解码 UED Python
Python批量修改指定目录下图片的大小名文章
Python批量修改指定目录下图片的大小名文章
20 1
|
2月前
|
存储 Python
Python学习笔记编程小哥令狐~持续更新、、、 (下)
Python学习笔记编程小哥令狐~持续更新、、、 (下)
35 1
|
2月前
|
存储 Python
【免费分享编程笔记】Python学习笔记(二)
【免费分享编程笔记】Python学习笔记(二)
48 0
【免费分享编程笔记】Python学习笔记(二)
|
2月前
|
索引 Python
Excel学习笔记(一):python读写excel,并完成计算平均成绩、成绩等级划分、每个同学分数大于70的次数、找最优成绩
这篇文章是关于如何使用Python读取Excel文件中的学生成绩数据,并进行计算平均成绩、成绩等级划分、统计分数大于70的次数以及找出最优成绩等操作的教程。
92 0
下一篇
DataWorks