import re import dircache days_in_months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] days_in_months_leap = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] def leap_year(year): if year % 4 == 0: if year % 100 != 0 or year % 400 == 0: return True else: return False else: return False def date_dist(date1, date2): if date1 < date2: sign = -1 date1, date2 = date2, date1 else: sign = 1 year1 = int(date1[0:4]) month1 = int(date1[4:6]) day1 = int(date1[6:8]) year2 = int(date2[0:4]) month2 = int(date2[4:6]) day2 = int(date2[6:8]) year = year2 daycount = 0 while year <= year1: if(leap_year(year)): daycount += 366 else: daycount += 365 year += 1 if leap_year(year2): my_days = days_in_months_leap else: my_days = days_in_months month1 -= 1 month2 -= 1 month = 0 while month < month2: daycount -= my_days[month] month += 1 daycount -= day2 if leap_year(year1): my_days = days_in_months_leap else: my_days = days_in_months month = 11 while month >= month1: daycount -= my_days[month] month -= 1 daycount += day1 return daycount*sign file_re = re.compile(r'2CSNAP-([0-9]{8})-([0-9]{4})-([^.]+)\.iso\.(bz2|gz)') def cmp_filtered(filt1, filt2): if filt1.date != filt2.date: return filt1.date - filt2.date else: return filt1.time - filt2.time class filtered_file(object): cmp = cmp_filtered def __init__(self, name='', date='', time='', tag=''): self.name = name self.date = date self.time = time self.tag = tag file_list = dircache.listdir('.')[:] filtered_list = [] for file_name in file_list: file_match = file_re.match(file_name) if file_match: fname = file_match.string fdate = int(file_match.expand(r'\1')) ftime = int(file_match.expand(r'\2')) ftag = file_match.expand(r'\3') filtered_list.append(filtered_file(fname, fdate, ftime, ftag)) tag_set = set([x.tag for x in filtered_list]) tag_dict = {} for tag in tag_set: tag_dict[tag] = [] for file in filtered_list: tag_dict[file.tag].append(file) for key in tag_dict.keys(): tag_dict[key].sort(cmp=filtered_file.cmp, reverse=True) keep_count=0 last_date=-1 list_len = len(tag_dict[key]) remove_list = [] for i,file in enumerate(tag_dict[key]): if i < list_len - 1: distance = date_dist(str(file.date), str(tag_dict[key][i+1].date )) else: distance = 30 #save the last one for historical reasons if keep_count < 30: if last_date == file.date: #print "remove", remove_list.append(file.name) pass else: keep_count += 1 #print "keep", #keep_list.append(file) last_date = file.date elif keep_count < 45: if date_dist(str(last_date),str(file.date)) + distance <= 7: #print "remove", remove_list.append(file.name) pass else: keep_count += 1 #print "keep", #keep_list.append(file) last_date = file.date else: if date_dist(str(last_date),str(file.date)) + distance <= 30: #print "remove" remove_list.append(file.name) pass else: #keep_list.append(file) #print "keep" last_date = file.date #print "%s made on %d is #%d" % (file.tag, file.date, i) #print key #print "------------------" #for dist in [date_dist(str(keep_list[i].date), # str(keep_list[i+1].date)) for i in range(0, len(keep_lis t) - 1)]: #print dist for filename in remove_list: print filename