-
Notifications
You must be signed in to change notification settings - Fork 0
/
filecompare.py
152 lines (144 loc) · 4.04 KB
/
filecompare.py
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# -*-coding:utf-8-*-
import os
import os.path
import sys
import platform
import getopt
import hashlib
from color_std_out import *
from getterminalsize import *
def usage():
print '[ * ] use like "python filecompare.py -s d:/tree -d d:/tree2"'
print '[ * ] or use like "python filecompare.py --src d:/tree --dst d:/tree2"'
def format_path(path):
plat_sys=platform.system()
if plat_sys == "Windows":
path=path.strip("\\")
elif plat_sys == "Linux":
path=path.strip("/")
return path
def get_tree(rootdir):
stack=[]
ret=[]
stack.append(rootdir)
while len(stack)>0:
tmp=stack.pop(len(stack)-1)
if os.path.isdir(tmp):
tmp=os.path.normcase(tmp)
ret.append(format_path(tmp.split(rootdir)[1]))
for item in os.listdir(tmp):
stack.append(os.path.join(tmp,item))
#print tmp
elif os.path.isfile(tmp):
tmp=os.path.normcase(tmp)
ret.append(format_path(tmp.split(rootdir)[1]))
#print tmp
return ret
def get_file_hash(file_path):
if os.path.exists(file_path):
sha1=hashlib.sha1()
f=open(file_path,"rb")
fdata=f.read()
sha1.update(fdata)
f.close()
return sha1.hexdigest()
else:
return False
def file_compare(src_path_list, dst_path_list,dst_file_hash_dict):
for path in src_path_list:
width,height=getTerminalSize()
full_path=os.path.join(src,path)
if os.path.isdir(full_path):
if path in dst_path_list:
width=width-12-len(path)
width="{:>"+str(width)+"}"
print "[ DIR ] "+path+width.format("[ "),
printGreen("*")
print " ]"
dst_path_list.remove(path)
elif path not in dst_path_list:
width=width-12-len(path)
width="{:>"+str(width)+"}"
print "[ DIR ] "+path+width.format("[ "),
printBlue("+")
print " ]"
elif os.path.isfile(full_path):
cur_file_sha1=get_file_hash(full_path)
if cur_file_sha1 in dst_file_hash_dict.keys():
if path==dst_file_hash_dict[cur_file_sha1]:
width=width-13-len(path)
width="{:>"+str(width)+"}"
print "[ FILE ] "+path+width.format("[ "),
printGreen("*")
print " ]"
dst_path_list.remove(path)
else:
width=width-24-len(path)-len(dst_file_hash_dict[cur_file_sha1])
width="{:>"+str(width)+"}"
print "[ FILE ] %s moved to %s" % (path,dst_file_hash_dict[cur_file_sha1]),
print width.format("[ "),
printSkyBlue(">")
print " ]"
dst_path_list.remove(dst_file_hash_dict[cur_file_sha1])
elif path in dst_file_hash_dict.values():
width=width-13-len(path)
width="{:>"+str(width)+"}"
print "[ FILE ] "+path+width.format("[ "),
printYellow("m")
print " ]"
dst_path_list.remove(path)
else:
width=width-13-len(path)
width="{:>"+str(width)+"}"
print "[ FILE ] "+path+width.format("[ "),
printBlue("+")
print " ]"
else:
pass
if dst_path_list:
for path in dst_path_list:
width,height=getTerminalSize()
width=width-13-len(path)
width="{:>"+str(width)+"}"
print "[ FILE ] "+path+width.format("[ "),
printRed("-")
print " ]"
opts, args = getopt.getopt(sys.argv[1:], "hs:d:", ["help", "src=", "dst="])
if not opts:
usage()
src=""
dst=""
for op, value in opts:
if op == "-s" or op == "--src":
src = value
if not os.path.exists(src):
print '[ * ] path "%s" does not exist,please check the param "-s"' % (src)
sys.exit()
else:
src = os.path.normcase(src)
src=src.rstrip("\\")
elif op == "-d" or op == "--dst":
dst = value
if not os.path.exists(dst):
print '[ * ] path "%s" does not exist,please check the param "-d"' % (dst)
sys.exit()
else:
dst = os.path.normcase(dst)
dst=dst.rstrip("\\")
else:
usage()
sys.exit()
src_path_list=get_tree(src)
dst_path_list=get_tree(dst)
src_path_list.remove('')
dst_path_list.remove('')
dst_file_hash_dict={}
print dst
for item in dst_path_list:
full_path=os.path.join(dst,item)
if os.path.isfile(full_path):
dst_file_hash_dict[get_file_hash(full_path)]=item
else:
pass
file_compare(src_path_list, dst_path_list,dst_file_hash_dict)
print dst_path_list