-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathfindrdd_dirname.py
185 lines (153 loc) · 6.47 KB
/
findrdd_dirname.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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#!/usr/bin/env python
# -*- coding=utf-8 -*-
# ./filename 打印同名且文件大小一样的不同子路径的文件名,时间
from __future__ import print_function
from operator import itemgetter
import os
import time
'tt为浮点型日期,换化为年月日时分秒格式时间'
def timeYS(tt):
t1 = time.localtime(tt)
t2 = time.strftime("%Y-%m-%d %H:%M:%S",t1)
return t2;
class File():
'''
copy move remove
'''
allfilecount = 0
rddfilecount = 0
singlefiles={}
rddfiles={}
rdddirs={}
def __init__(self):
'''
Constructor
'''
def getFileMsg(self,filepath):
'''
以元组(filepath,ftime,size)形式输出文件信息
'''
if os.path.isfile(filepath):
size = os.path.getsize(filepath) #bytes B
if size <= 1024:
size ='{0}B'.format(size);
elif size <= 1024*1024:
size = size/1024
size ='{0}K'.format(size);
else:
size = size/1024/1024
size ='{0}M'.format(size);
#filename = os.path.basename(filepath)
ftime = timeYS(os.path.getmtime(filepath))
return (filepath,ftime,size)
return ()
def setRedundanceFile(self,filepath):
'''
根据文件名称和大小判断文件是否重复,文件信息:元组(filepath,mtime,size) ,getFileMsg返回值
1. 遍历某一目录下所有文件
2. 将文件的名称及大小组成一个字符串,做为 key 放入字典 dict1 ,其 value 为 文件信息
3. 每次放入时时判断 key 是否存在,若存在,就将 文件信息 放入字典 dict2
4. dict2 的 key 为 文件名称,value为 文件信息 列表 list1
'''
try:
if os.path.isdir(filepath):
for fil in os.listdir(filepath):
fil = os.path.join(filepath,fil)
# print('当前路径以及文件名')
# print(fil)
self.setRedundanceFile(fil)
elif os.path.isfile(filepath):
self.allfilecount = self.allfilecount + 1
size = os.path.getsize(filepath)
filename = os.path.basename(filepath)
f = self.getFileMsg(filepath)
# print (f)
# print ('123')
# print("f[0]")
# print (f[0])
filekey = '{0}_{1}'.format(filename, size)
if self.singlefiles.has_key(filekey):
self.rddfilecount = self.rddfilecount + 1
#增加规则:发现一个重复文件时,在父目录下文件数加1,若是首次发现则取该文件在总文件列表的父目录,其数目也加1
pardir = os.path.dirname(filepath)
if self.rdddirs.has_key(pardir):
self.rdddirs[pardir] = self.rdddirs.get(pardir)+1
else:
self.rdddirs[pardir] = 1
if self.rddfiles.has_key(filekey) :
self.rddfiles[filekey].append(f)
else:
self.rddfiles[filekey] = [f]
f = self.singlefiles.get(filekey)
self.rddfiles[filekey].append(f)
#若是首次发现则取该文件在总文件列表的父目录,其数目也加1
pardir = os.path.dirname(f[0])
# print ("pardir")
# print (pardir)
if self.rdddirs.has_key(pardir):
self.rdddirs[pardir] = self.rdddirs.get(pardir)+1
else:
self.rdddirs[pardir] = 1
else:
self.singlefiles[filekey]=f
else:
return
except Exception as e:
print(e)
def showFileCount(self):
print(self.allfilecount)
def showRedundanceFile(self,filepath):
'''
根据文件名称和大小判断文件是否重复
'''
self.allfilecount = 0
self.rddfilecount = 0
self.singlefiles={}
self.rddfiles={}
self.setRedundanceFile(filepath)
print('the total file num:{0},the redundance file num(not including the first file):{1}'.format(self.allfilecount,self.rddfilecount))
print('-----------------------------------------')
for k in self.rddfiles.keys():
for l in sorted(self.rddfiles.get(k), key=itemgetter(1)): #按修改日期升序排列
# print ("l[0]");
print ("打印路径")
print (l[0]);
print (l[1],l[2]);
# print (l);
print('#######\n\n\n');
print('------------------------------------------')
def showCanRemoveFile(self,filepath):
'''
根据文件名称和大小判断文件是否重复
输出按修改时间较旧的文件
'''
self.allfilecount = 0
self.rddfilecount = 0
self.singlefiles={}
self.rddfiles={}
rmlist = []
self.setRedundanceFile(filepath)
for k in self.rddfiles.keys():
tmplist = sorted(self.rddfiles.get(k), key=itemgetter(1))
tmplist.pop()
rmlist.extend(tmplist)
for rl in rmlist:
print(rl[0])
def rdddirstat(self):
'''
按目录统计文件重复个数
输出:目录/tmp 重复个数5,是指/tmp目录下有5个文件在其他地方也存在
'''
if len(self.rdddirs)> 0 :
print('The redundance file statistics by dirs:')
for rd in self.rdddirs.keys():
print('{0} {1}'.format(rd, self.rdddirs.get(rd)))
else:
print('There are no redundance files')
if __name__ == '__main__':
f = File()
filepath = os.getcwd()
#filepath = '/scripts'
f.showRedundanceFile(filepath) #查看多余的文件
#f.showCanRemoveFile(filepath) #按修改时间给出比较旧的多余文件
f.rdddirstat() #按目录统计重复文件个数