python实现查看目录下重复的文件

python实现查看目录下重复的文件

该python 脚本有以下三个功能:

  1. 实现查看目录下重复的文件,输出文件按修改时间升序排列

  2. 将按修改时间排列比较旧的、可删除的文件列出来

  3. 按目录对重复文件进行统计,比如,目录/tmp 重复个数5,是指/tmp目录下有5个文件在其他地方也存在

python脚本

#!/usr/bin/env python
#coding=utf-8
'''
Created on Nov 30, 2016

@author: fangcheng
'''
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)
                    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)

                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])
                        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);
            print('');
        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()                 #按目录统计重复文件个数
  • 脚本添加执行权限后,可直接在服务器上执行
chmod +x findrdd.py
  • linux上执行示例
[root@bak scripts]# ./findrdd.py 
the total file num:33,the redundance file num(not including the first file):5
-----------------------------------------
('/scripts/bkapp.sh', '2016-03-09 16:31:03', '3K')
('/scripts/esgcc/bkapp.sh', '2016-03-10 11:06:06', '3K')

('/scripts/show_rollbak.txt', '2016-03-09 10:50:02', '2K')
('/scripts/esgcc/show_rollbak.txt', '2016-03-10 11:06:06', '2K')

('/scripts/esgcc/deploy.sh', '2016-03-10 11:36:19', '8K')
('/scripts/deploy.sh', '2016-03-11 11:42:04', '8K')

('/scripts/rollback.sh', '2016-03-10 10:22:33', '10K')
('/scripts/esgcc/rollback.sh', '2016-03-10 11:06:06', '10K')

('/scripts/show_deploy.txt', '2016-03-09 10:50:02', '2K')
('/scripts/esgcc/show_deploy.txt', '2016-03-10 11:06:06', '2K')

------------------------------------------
The redundance file statistics by dirs:
/scripts 5
/scripts/esgcc 5
  • windows上执行示例(需要安装python):
C:\Users\fei\Desktop\tmp>python findrdd.py
the total file num:42,the redundance file num(not including the first file):10
-----------------------------------------
('C:\\Users\\fei\\Desktop\\tmp\\build\\build\\src\\application\\application.css', '2016-11-22 13:11:51', '101B')
('C:\\Users\\fei\\Desktop\\tmp\\build\\project\\src\\application\\application.css', '2016-11-22 13:11:51', '101B')
('C:\\Users\\fei\\Desktop\\tmp\\build\\build\\classes\\application\\application.css', '2016-11-22 13:11:53', '101B')

('C:\\Users\\fei\\Desktop\\tmp\\build\\project\\src\\login\\Login.java', '2016-11-22 13:11:51', '3K')
('C:\\Users\\fei\\Desktop\\tmp\\build\\build\\src\\login\\Login.java', '2016-11-22 13:11:52', '3K')

('C:\\Users\\fei\\Desktop\\tmp\\build\\dist\\LoginCSS.jar', '2016-11-22 13:11:53', '55K')
('C:\\Users\\fei\\Desktop\\tmp\\build\\deploy\\LoginCSS.jar', '2016-11-22 13:11:54', '55K')

('C:\\Users\\fei\\Desktop\\tmp\\build\\project\\src\\login\\background.jpg', '2016-11-22 13:11:51', '51K')
('C:\\Users\\fei\\Desktop\\tmp\\build\\build\\src\\login\\background.jpg', '2016-11-22 13:11:52', '51K')
('C:\\Users\\fei\\Desktop\\tmp\\build\\build\\classes\\login\\background.jpg', '2016-11-22 13:11:53', '51K')

('C:\\Users\\fei\\Desktop\\tmp\\build\\project\\src\\application\\Main.java', '2016-11-22 13:11:50', '633B')
('C:\\Users\\fei\\Desktop\\tmp\\build\\build\\src\\application\\Main.java', '2016-11-22 13:11:51', '633B')

('C:\\Users\\fei\\Desktop\\tmp\\build\\project\\src\\login\\Test.java', '2016-11-22 13:11:51', '443B')
('C:\\Users\\fei\\Desktop\\tmp\\build\\build\\src\\login\\Test.java', '2016-11-22 13:11:52', '443B')

('C:\\Users\\fei\\Desktop\\tmp\\build\\project\\src\\login\\Login.css', '2016-11-22 13:11:51', '2K')
('C:\\Users\\fei\\Desktop\\tmp\\build\\build\\src\\login\\Login.css', '2016-11-22 13:11:52', '2K')
('C:\\Users\\fei\\Desktop\\tmp\\build\\build\\classes\\login\\Login.css', '2016-11-22 13:11:53', '2K')

------------------------------------------
The redundance file statistics by dirs:
C:\Users\fei\Desktop\tmp\build\build\src\application 2
C:\Users\fei\Desktop\tmp\build\deploy 1
C:\Users\fei\Desktop\tmp\build\build\classes\application 1
C:\Users\fei\Desktop\tmp\build\project\src\login 4
C:\Users\fei\Desktop\tmp\build\dist 1
C:\Users\fei\Desktop\tmp\build\build\classes\login 2
C:\Users\fei\Desktop\tmp\build\project\src\application 2

输出结果中第二个方法-输出可删除文件列表注释掉了,该删除方式仅供参考,是否按这种“最新修改的文件就是有效文件、其他文件皆可不要”方式筛选尚需自我决定。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,746评论 0 10
  • 第 2 章 SHELL 基础知识2.1 shell脚本我们在上面简单介绍了一下什么是shell脚本,现在我们来进一...
    LiWei_9e4b阅读 1,571评论 0 0
  • 1.Linux上的文件管理类命令,其常用的使用方法及其相关示例演示 文件与目录的管理上,不外乎显示属性、 拷贝、删...
    whamai阅读 264评论 0 0
  • Python语言特性 1 Python的函数参数传递 看两个如下例子,分析运行结果: 代码一: a = 1 def...
    伊森H阅读 3,065评论 0 15
  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,718评论 0 11