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
输出结果中第二个方法-输出可删除文件列表注释掉了,该删除方式仅供参考,是否按这种“最新修改的文件就是有效文件、其他文件皆可不要”方式筛选尚需自我决定。
python实现查看目录下重复的文件的更多相关文章
- python引入同一目录下的py文件
python引入同一目录下的py文件 注意:python2和python3的包内import语法有区别,下面介绍一下python3的包内import语法 例如在admin.py文件中要引入dealco ...
- Python读取一个目录下的所有文件
#!/usr/bin/python # -*- coding:utf8 -*- import os allFileNum = 0 def printPath(level, path): global ...
- python 删除一个目录下的所有文件
一个目录下有文件,文件夹,文件夹里又有文件.文件夹....用python脚本,实现,递归删除一个目录下的所有文件: 目录结构如下: 其中我们要删除所有文件 代码实现如下: import os CUR_ ...
- Python读取指定目录下指定后缀文件并保存为docx
最近有个奇葩要求 要项目中的N行代码 申请专利啥的 然后作为程序员当然不能复制粘贴 用代码解决.. 使用python-docx读写docx文件 环境使用python3.6.0 首先pip安装pytho ...
- linux怎么实时查看目录下是否有文件生成
inotify-tools 是为linux下inotify文件监控工具提供的一套c的开发接口库函数,同时还提供了一系列的命令行工具,这些工具可以用来监控文件系统的事件. inotify-tools是用 ...
- Python列出指定目录下的子目录/文件或者递归列出
1.python只列出当前目录(或者指定目录)下的文件或者目录条目 import os files,dirs=[],[] for item in os.listdir(): if os.path.is ...
- 【python】获取目录下的最新文件夹/文件
直接上代码 def new_report(test_report): lists = os.listdir(test_report) #列出目录的下所有文件和文件夹保存到lists print(lis ...
- python将指定目录下的所有文件夹用随机数重命名
我的目的在于打乱数据顺序,便于GAN训练: import random import os path = 'hunhe_7' #目标文件夹 listname = os.listdir(path) #遍 ...
- PHP查看目录下的所有文件
[1].[代码] [PHP]代码 跳至 [1] ? 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 ...
随机推荐
- 网络适配器输入的IP地址 已经分配给另一个适配器
解决步骤:1.开始-运行-cmd2. set devmgr_show_nonpresent_devices=123.set devmgr_show_nonpresent_devices=14.star ...
- Android--自定义加载框
1,在网上看了下好看的加载框,看了一下,挺好看的,再看了下源码,就是纯paint画出来的,再加上属性动画就搞定了 再来看一下我们的源码 LvGhost.java package com.qianmo. ...
- struts 国际化
国际化 1. 国际化与本地化 国际化 (Internationalization: I18N): 是程序在不做任何修改的情况下,就可以再不同的国家或地区和不同的语言环境下,按照当地的语言和格式习惯显示 ...
- 【原创】如何在Android Studio下调试原生安卓Framework层面的源代码
1. Open Existing Android Studio Project. 2. 打开后, Projects -> Android 里面是空的. 这时候,需要选到 Projects-> ...
- C语言回顾-二维数组
1.二维数组:是一个特殊的一维数组 完全初始化: 1)int a[2][3]={{1,2,3},{2,3,4}}; 2)连续赋值int a[2][3]={1,2,3,2,3,4}; 3)可以省略第一维 ...
- Win10 驱动装不上,提示:Windows 无法验证此设备所需的驱动程序的数字签名。该值受安全引导策略保护,无法进行修改或删除。
Windows 无法验证此设备所需的驱动程序的数字签名.某软件或硬件最近有所更改,可能安装了签名错误或损毁的文件,或者安装的文件可能是来路不明的恶意软件.(代码52) 最近换了新主板,升级了Windo ...
- QT网络编程
bool QAbstractSocket::waitForReadyRead(int msecs = 30000) bool QAbstractSocket::waitForDisconnected( ...
- (更新)Java + 腾讯企业邮箱 + javamail + SSL 发送邮件
咳咳~最头疼的就是莫名其妙的错误. 本来今年6月份运行通过的代码,过俩月就报错了. javax.mail.MessagingException: Could not connect to SMTP h ...
- JVM之几种垃圾收集器简单介绍
本文中的垃圾收集器研究背景为:HotSpot+JDK1.7 一.垃圾收集器概述 如上图所示,垃圾回收算法一共有7个,3个属于年轻代.三个属于年老代,G1属于横跨年轻代和年老代的算法. JVM会从年轻代 ...
- Android ProgressBar分析及自定义ProgressBar
ProgressBar是在执行耗时操作时的一种人性化设计.分为两种形式:转圈的,能显示进度的. 而能取决于是什么样式的PregressBar,当然就是PregressBar的样式啦~ Widget.P ...